C#中的typeof操作符与Type类型:揭秘.NET反射的基础
引言
在C#编程中,反射(Reflection)是一种强大的机制,它允许我们在运行时检查和操作类型、方法、属性等程序元素。而这种反射能力的核心就是typeof
操作符和System.Type
类。当我们希望动态加载程序集、创建对象实例、调用方法,或者进行各种运行时类型检查时,它们便成为我们不可或缺的工具。本文将深入探讨typeof
操作符和Type
类的关系,以及它们在.NET生态系统中的重要作用。
typeof操作符:获取类型信息的入口
在C#中,typeof
是一个操作符,它允许我们获取任何类型的元数据信息。这个操作符在编译时计算,返回一个代表指定类型的System.Type
对象。简单来说,typeof
就是我们进入反射世界的大门。
typeof的基本使用
typeof
操作符的语法非常简单:
csharp
Type typeInfo = typeof(ClassName);
例如,如果我们想获取string
类型的类型信息:
csharp
Type stringType = typeof(string);
Console.WriteLine(stringType.FullName); // 输出: System.String
值得注意的是,typeof
操作符接受的是类型名称,而不是变量。它在编译时就能确定结果,因此是一个静态操作。
typeof与其他获取类型的方法对比
在C#中,除了typeof
操作符外,还有其他获取类型信息的方法,如object.GetType()
方法:
csharp
string text = "Hello";
Type type1 = typeof(string); // 通过类型名获取Type
Type type2 = text.GetType(); // 通过实例对象获取TypeConsole.WriteLine(type1 == type2); // 输出: True
这两种方法的关键区别在于:
typeof
是在编译时确定类型,需要你在代码中明确指定类型名GetType()
是在运行时确定对象的实际类型,它获取的是对象实例的实际类型信息
这一差异在处理继承关系时尤为明显:
csharp
object obj = "Hello World";
Console.WriteLine(typeof(object) == obj.GetType()); // 输出: False
// typeof(object)返回System.Object类型
// obj.GetType()返回System.String类型,因为obj实际引用的是字符串
System.Type类:反射的基石
System.Type
类是.NET反射机制的核心,它封装了关于类型的所有元数据。每当我们使用typeof
操作符时,实际上是在获取一个Type
对象的引用。这个对象包含了关于类型的详尽信息。
Type类的重要属性和方法
Type
类提供了丰富的属性和方法,让我们能够全面了解一个类型:
- 基本信息获取:
csharp
Type stringType = typeof(string); Console.WriteLine(stringType.Name); // 输出: String Console.WriteLine(stringType.FullName); // 输出: System.String Console.WriteLine(stringType.Namespace); // 输出: System Console.WriteLine(stringType.Assembly); // 输出: System.Private.CoreLib, Version=...
- 类型特性检查:
csharp
Console.WriteLine(stringType.IsClass); // 输出: True Console.WriteLine(stringType.IsValueType); // 输出: False Console.WriteLine(stringType.IsSealed); // 输出: True Console.WriteLine(stringType.IsAbstract); // 输出: False Console.WriteLine(stringType.IsInterface); // 输出: False
- 成员信息获取:
csharp
// 获取公共方法 MethodInfo[] methods = stringType.GetMethods(); foreach (var method in methods.Take(5)) // 仅显示前5个方法Console.WriteLine(method.Name);// 获取公共属性 PropertyInfo[] properties = stringType.GetProperties(); foreach (var property in properties)Console.WriteLine(property.Name);
- 动态创建实例:
csharp
Type listType = typeof(List<int>); // 创建一个List<int>的实例 object listInstance = Activator.CreateInstance(listType);// 使用反射调用Add方法 MethodInfo addMethod = listType.GetMethod("Add"); addMethod.Invoke(listInstance, new object[] { 123 });
Type类的继承层次
Type
类本身具有复杂的继承结构。它是一个抽象类,派生自MemberInfo
类。在实际使用时,我们操作的是Type
的具体实现类的实例,不过这些细节通常对于日常编程来说是透明的。
MemberInfo└── Type├── RuntimeType (内部实现)└── 其他特定运行时的Type实现
typeof与Type在实际应用中的场景
了解了typeof
和Type
的基础知识后,让我们探讨一些实际应用场景:
1. 泛型编程中的类型约束
csharp
public class GenericRepository<T> where T : class
{public void PrintEntityType(){Type entityType = typeof(T);Console.WriteLine($"Entity type: {entityType.Name}");}
}
2. 动态加载和使用程序集
csharp
// 加载程序集
Assembly assembly = Assembly.LoadFrom("MyLibrary.dll");// 获取程序集中的所有类型
Type[] types = assembly.GetTypes();// 查找特定接口的实现
Type targetInterface = typeof(IMyService);
var implementers = types.Where(t => targetInterface.IsAssignableFrom(t) && !t.IsInterface);foreach(var impl in implementers)
{// 创建实例并使用object instance = Activator.CreateInstance(impl);// ...
}
3. 配置系统和依赖注入
现代框架如ASP.NET Core在依赖注入中大量使用反射和类型信息:
csharp
// ASP.NET Core启动配置
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
services.AddTransient<IUserService, UserService>();
4. 序列化和反序列化
JSON序列化库和ORM框架通常需要了解类型的属性结构:
csharp
Type personType = typeof(Person);
PropertyInfo[] properties = personType.GetProperties();foreach (var prop in properties)
{// 检查是否有特定属性标记var jsonIgnore = prop.GetCustomAttribute<JsonIgnoreAttribute>();if (jsonIgnore != null)continue;// 处理序列化逻辑...
}
实用示例:构建简单的依赖注入容器
为了更好地理解typeof
和Type
的实际应用,让我们实现一个简单的依赖注入容器:
csharp
public class SimpleContainer
{private Dictionary<Type, Type> _registrations = new Dictionary<Type, Type>();private Dictionary<Type, object> _instances = new Dictionary<Type, object>();// 注册类型public void Register<TInterface, TImplementation>() where TImplementation : TInterface{_registrations[typeof(TInterface)] = typeof(TImplementation);}// 解析类型public T Resolve<T>(){return (T)Resolve(typeof(T));}private object Resolve(Type type){// 先检查是否有缓存的实例if (_instances.TryGetValue(type, out var cachedInstance))return cachedInstance;// 检查是否有注册的实现if (_registrations.TryGetValue(type, out var implementationType)){// 创建实例var instance = CreateInstance(implementationType);_instances[type] = instance;return instance;}// 如果没有注册,尝试直接创建类型实例if (!type.IsAbstract && !type.IsInterface){var instance = CreateInstance(type);_instances[type] = instance;return instance;}throw new InvalidOperationException($"Cannot resolve type: {type.Name}");}private object CreateInstance(Type type){// 获取构造函数var constructor = type.GetConstructors().First();// 解析构造函数参数var parameters = constructor.GetParameters().Select(p => Resolve(p.ParameterType)).ToArray();// 创建实例return constructor.Invoke(parameters);}
}
使用这个简单容器的示例:
csharp
// 接口和实现
public interface ILogger
{void Log(string message);
}public class ConsoleLogger : ILogger
{public void Log(string message){Console.WriteLine($"LOG: {message}");}
}public class UserService
{private readonly ILogger _logger;public UserService(ILogger logger){_logger = logger;}public void CreateUser(string username){_logger.Log($"Creating user: {username}");// 实际创建用户的逻辑...}
}// 使用容器
var container = new SimpleContainer();
container.Register<ILogger, ConsoleLogger>();// 解析服务
var userService = container.Resolve<UserService>();
userService.CreateUser("Alice");
在这个例子中,我们大量使用了typeof
操作符和Type
类来实现基本的依赖注入功能:
- 使用
typeof
获取接口和实现类的类型信息 - 使用
Type.GetConstructors()
获取构造函数 - 分析构造函数参数,递归解析依赖项
这是现代依赖注入框架(如ASP.NET Core的内置DI、Autofac、Unity等)的工作原理基础。
性能考虑
虽然反射功能强大,但它也带来性能开销。对于一些关键路径上的代码,过度使用反射可能导致性能问题。在实际应用中,我们通常会采取以下策略:
- 类型信息缓存:避免重复获取相同的类型信息
- 表达式树:将反射操作编译为表达式树,提高执行效率
- 使用专用库:如
FastMember
、Fasterflect
等,它们针对常见反射操作进行了优化
csharp
// 使用表达式树优化属性访问
public static class PropertyAccessor<T>
{public static Func<T, object> CreateGetter(PropertyInfo property){var instance = Expression.Parameter(typeof(T), "instance");var propertyAccess = Expression.Property(instance, property);var convert = Expression.Convert(propertyAccess, typeof(object));return Expression.Lambda<Func<T, object>>(convert, instance).Compile();}
}
结论
typeof
操作符和System.Type
类是C#反射系统的核心组件,它们为我们提供了在运行时检查和操作类型的能力。无论是依赖注入、动态加载程序集、序列化,还是各种框架和库的开发,它们都扮演着至关重要的角色。
掌握这些概念不仅能帮助我们更好地理解现有框架的工作原理,还能让我们在需要时构建出灵活而强大的解决方案。不过,我们也需要明智地使用反射,在灵活性和性能之间找到适当的平衡点。
当你下次看到typeof(SomeType)
的代码时,希望你能更深入地理解它背后的机制和可能性。反射是.NET平台的一颗明珠,而typeof
和Type
则是开启这颗明珠的钥匙。
相关文章:
C#中的typeof操作符与Type类型:揭秘.NET反射的基础
引言 在C#编程中,反射(Reflection)是一种强大的机制,它允许我们在运行时检查和操作类型、方法、属性等程序元素。而这种反射能力的核心就是typeof操作符和System.Type类。当我们希望动态加载程序集、创建对象实例、调用方法&…...
鸿蒙OSUniApp 实现的表单验证与提交功能#三方框架 #Uniapp
UniApp 实现的表单验证与提交功能 前言 在移动端应用开发中,表单是用户与应用交互的重要媒介。一个好的表单不仅布局合理、使用方便,还应该具备完善的验证与提交功能,以确保用户输入的数据准确无误。本文将分享如何在 UniApp 中实现表单验证…...
开源的跨语言GUI元素理解8B大模型:AgentCPM-GUI
一、模型概述 AgentCPM-GUI 是由清华大学自然语言处理实验室 (THUNLP) 和 ModelBest 联合开发的开源大模型。该模型基于 MiniCPM-V 架构,拥有 80 亿参数规模,是一个能够直接在终端设备上运行的轻量化智能体。它创新性地将多模态输入与 GUI 操作相结合&a…...
Function Calling
在介绍Function Calling之前我们先了解一个概念,接口。 接口 两种常见接口: 人机交互接口,User Interface,简称 UI应用程序编程接口,Application Programming Interface,简称 API接口能「通」的关键,是两边都要遵守约定。 人要按照 UI 的设计来操作。UI 的设计要符合人…...
星巴克中国要卖在高点
9%能否救70%的急? 作者|古廿 编辑|文昌龙 星巴克中国刚刚回暖,总部出售的计划再次提上日程。 5月15日,外媒又适时放出消息:星巴克将开始出售其在中国的股份。消息人士称,星巴克本周通过一位财务顾问向几位潜在投资…...
Docker实现MySQL数据库主从复制
一、拉取数据库镜像 docker pull mysql:5.7二、创建两个数据库(一主一从模式) mysql01(主) 1.docker run -d -p 3310:3306 -v /root/mysql/node-1/init:/docker-entrypoinit-initdb.d -v /root/mysql/node-1/config:/etc/mysql/conf.d -v /root/mysq…...
【物联网】基于树莓派的物联网开发【4】——WIFI+SSH远程登录树莓派
使用背景 没有有线网络,无屏幕如何远程登录?程序猫教大家如何通过电脑wifi热点的方式连接树莓派,ssh连接访问树莓派,包括putty开源远程工具进行连接,VNC远程桌面显示。 注:新手建议买一个树莓派配置的显示…...
CentOS7 OpenSSL升级1.1.1w
1.安装依赖 # openssl-3.4.0需要perl-IPC-Cmd perl-Data-Dumper yum -y install gcc* yum -y install perl-IPC-Cmd perl-Data-Dumper 2.备份、卸载旧OpenSSL 查找安装目录并备份 # whereis openssl openssl: /usr/bin/openssl /usr/lib64/openssl /usr/share/man/man1/op…...
高精度降压稳压技术在现代工业自动化中的应用
一、引言 在现代工业自动化的浪潮中,电源管理技术犹如隐藏在精密机械背后的智囊,虽不直接参与生产流程的逻辑决策,却是保障各类自动化设备稳定、高效运行的基石。高精度降压稳压技术,作为电源管理领域的核心分支,聚焦…...
鸿蒙OSUniApp制作动态筛选功能的列表组件(鸿蒙系统适配版)#三方框架 #Uniapp
使用UniApp制作动态筛选功能的列表组件(鸿蒙系统适配版) 前言 随着移动应用的普及,用户对应用内容检索和筛选的需求也越来越高。在开发跨平台应用时,动态筛选功能已成为提升用户体验的重要组成部分。本文将详细介绍如何使用UniA…...
Qt中控件的Viewport作用
在Qt中,viewport是控件中用于显示内容的一个概念区域,它在可滚动控件中尤为重要。以下是viewport的主要作用和特点: 主要作用 内容显示区域:viewport定义了控件中实际可见的部分,所有内容都在这个区域内显示。 滚动机…...
论文学习_Precise and Accurate Patch Presence Test for Binaries
摘要:打补丁是应对软件漏洞的主要手段,及时将补丁应用到所有受影响的软件上至关重要,然而这一点在实际中常常难以做到,研究背景。因此,准确检测安全补丁是否已被集成进软件发行版本的能力,对于防御者和攻击…...
ubuntu服务器版启动卡在start job is running for wait for...to be Configured
目录 前言 一、原因分析 二、解决方法 总结 前言 当 Ubuntu 服务器启动时,系统会显示类似 “start job is running for wait for Network to be Configured” 或 “start job is running for wait for Plymouth Boot Screen Service” 等提示信息,并且…...
国产数据库工具突围:SQLynx如何解决Navicat的三大痛点?深度体验报告
引言:Navicat的"中国困境" 当开发者面对达梦数据库的存储过程调试,或是在人大金仓中处理复杂查询时,Navicat突然变得力不从心——这不是个例。 真实痛点:某政务系统迁移至OceanBase后,开发团队发现Navicat无…...
牛客网NC21994:分钟计算
牛客网NC21994:分钟计算 📝 题目描述 输入格式 输入两行,每行包含两个整数,分别表示小时和分钟第一行表示起始时间,第二行表示结束时间 输出格式 输出一个整数,表示两个时间点之间的分钟数 示例 输入…...
全球宠物经济新周期下的亚马逊跨境采购策略革新——宠物用品赛道成本优化三维路径
在全球"孤独经济"与"银发经济"双轮驱动下,宠物用品市场正经历结构性增长。Euromonitor数据显示,2023年全球市场规模突破1520亿美元,其中中国供应链贡献度达38%,跨境电商出口增速连续三年超25%。在亚马逊流量红…...
Tomcat多应用部署与静态资源路径问题全解指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
128.在 Vue 3 中使用 OpenLayers 实现绘制矩形截图并保存地图区域
📌 本文将介绍如何在 Vue 3 中使用 OpenLayers 实现: 1)用户可在地图上绘制矩形; 2)自动截取该区域地图为图片; 3)一键保存为本地 PNG 图片。 ✨效果如下图所示 🧠一、前言 在地图类…...
使用 163 邮箱实现 Spring Boot 邮箱验证码登录
使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器,实现 Spring Boot 项目中的邮件验证码发送功能,并解决常见配置报错问题。 一、为什么需要邮箱授权码? 出于安全考虑,大…...
python处理异常,JSON
异常处理 #异常处理 # 在连接MySQL数据库的过程中,如果不能有效地处理异常,则异常信息过于复杂,对用户不友好,暴露过多的敏感信息 # 所以,在真实的生产环境中, 程序必须有效地处理和控制异常,按…...
原生微信小程序 textarea组件placeholder无法换行的问题解决办法
【问题描述】 微信小程序原生代码,使用文本域,placeholder使用\n 没有效果,网上找了一堆方案说使用 也没有效果 最后在一个前端大佬博客,找到解决办法,CSS设置word-wrap: break-word; white-space: pre-line; 【解决办…...
毕设设计 | 管理系统图例
文章目录 环素1. 登录、注册2. 菜单管理 环素 1. 登录、注册 2. 菜单管理 公告通知 订单管理 会员管理 奖品管理 新增、编辑模块...
激光雷达视觉定位是3D视觉定位吗?
激光雷达视觉定位通常被归类为3D视觉定位,但具体来说,它是融合了激光雷达(LiDAR)数据和视觉(图像)数据的多模态3D定位方法。我们可以从几个角度来理解这点: 为什么说它属于3D视觉定位ÿ…...
每周靶点:NY-ESO-1、GPC3、IL27分享
本期精选了《自身免疫性癌抗原NY-ESO-1》《肝细胞癌标记物GPC3》《白细胞介素IL27》三篇文章。以下为各研究内容的概述: 自身免疫性癌抗原NY-ESO-1 NY-ESO-1是一种自身免疫性癌抗原,也称为CTA1B(CTAG1B),由主要组织相…...
Maven 插件参数注入与Mojo开发详解
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
Java详解RabbitMQ工作模式之发布订阅模式
目录 一、发布订阅模式简介二、发布订阅模式的工作原理2.1 核心组件2.2 工作流程 三、代码示例3.1 生产者代码3.2 消费者代码 四、实际应用场景五、注意事项六、总结 在分布式系统中,消息队列作为异步通信的桥梁,扮演着至关重要的角色。而 RabbitMQ&…...
UR5e机器人Matlab仿真
在 MATLAB 中使用 UR5e 机器人模型进行仿真和控制,通常需要结合机器人系统工具箱(Robotics System Toolbox) UR5e loadrobot("universalUR5e","DataFormat","column"); UR5e.Gravity [0 0 -9.81]; % 保存机器…...
[ctfshow web入门] web75
信息收集 scandir被禁用了 解题 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false ) {echo $file."<br>";}c…...
论文中表格跨页该怎么整(如何给跨页表格添加标题和表头)
标题:光标移动到第一行表格,然后快捷键;ctrl shirft enter,就会发现第二页多了一行,再把标题复制张贴过来即可 表头: 光标移动到第一行表格,鼠标右键 选择插入 再选择在上方插入行,然后手动添加…...
day26 Python 自定义函数
目录 一、函数的基本定义 示例 1:不带参数的函数 示例 2:查看文档字符串 二、带参数的函数 示例 3:带一个参数的函数 示例 4:带多个参数的函数 三、带返回值的函数 示例 5:计算两个数的和并返回结果 示例 6&am…...
洛谷P4907题解
题目传送门 题意: 扑克牌的部分牌被移除,需从剩牌中选 4 个区间,每个区间的牌都是同一花色且点数连续。如果不可选,输出最少需添加几张牌才能满足要求。 思路: 暴力和剪枝。 暴力:按照题意模拟ÿ…...
【MyBatis插件】PageHelper 分页
前言 在开发 Web 应用时,我们经常需要处理海量数据的展示问题。例如,在一个电商平台上,商品列表可能有成千上万条数据。如果我们一次性将所有数据返回给前端,不仅会导致页面加载缓慢,还会对数据库造成巨大压力。为了解…...
AI数字人融合VR全景:从技术突破到可信场景落地
摘要 本文深度解析AI数字人与VR全景技术融合的技术架构,结合故宫博物院、西门子、强生等真实行业案例,揭示技术落地的关键路径与量化价值。通过具体技术参数、实施细节及权威机构数据,构建可信的技术应用图景,为开发者提供可复用…...
机器学习——朴素贝叶斯练习题
一、 使用鸢尾花数据训练多项式朴素贝叶斯模型,并评估模型 代码展示: from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.naive_bayes impor…...
【爬虫】DrissionPage-3
安装:4.1最新版本 pip install drissionpage --upgrade 官方文档:🛰️ 连接浏览器 | DrissionPage官网 1 Chromium对象 Chromium对象用于连接和管理浏览器。标签页的开关和获取、整体运行参数配置、浏览器信息获取等都由它进行。 1.1 默认…...
网络爬虫学习之httpx的使用
开篇 本文整理自《Python3 网络爬虫实战》,主要是httpx的使用。 笔记整理 使用urllib库requests库的使用,已经可以爬取绝大多数网站的数据,但对于某些网站依然无能为力。 这是因为这些网站强制使用HTTP/2.0协议访问,这时urllib和r…...
TASK02【Datawhale 组队学习】使用 LLM API 开发应用
文章目录 system prompt 和 user prompt高效prompt:用清晰、详尽的语言表达 Prompt原则一:清晰,具体的指令分隔符寻求结构化的输出要求模型检查是否满足条件提供少量示例 "Few-shot" prompting 原则二,给模型时间去思考…...
黑马k8s(七)
1.Pod介绍 查看版本: 查看类型,这里加s跟不加s没啥区别,可加可不加 2.Pod基本配置 3.镜像拉去策略 本地没有这个镜像,策略是Never,启动失败 查看拉去策略: 更改拉去策略: 4.启动命令 运行的是nginx、busv…...
【FMC216】基于 VITA57.1 的 2 路 TLK2711 发送、2 路 TLK2711 接收 FMC 子卡模块
产品概述 FMC216 是一款基于 VITA57.1 标准规范的 2 路 TLK2711 接收、2 路 TLK2711 发送 FMC 子卡模块。该板卡支持 2 路 TLK2711 数据的收发,支持线速率 1.6Gbps,经过 TLK2711 高速串行收发器,可以将 1.6Gbps 的高速串行数据解串为 16 位并…...
如何在Edge浏览器里-安装梦精灵AI提示词管理工具
方案一(应用中心安装-推荐): 梦精灵 跨平台AI提示词管理工具 - Microsoft Edge AddonsMake Microsoft Edge your own with extensions that help you personalize the browser and be more productive.https://microsoftedge.microsoft.com…...
Ubuntu shell指定conda的python环境启动脚本
Ubuntu shell指定conda的python环境启动脚本。 通过指令,获取目前系统的conda虚拟python环境 conda info -e 如下图所示,为我自己电脑的python环境 # conda environments: # base * /home/ubuntu/miniconda3 kitti …...
深入理解无监督学习与K-means聚类算法:原理与实践
一、无监督学习概述 无监督学习(Unsupervised Learning)是机器学习的重要分支之一,与有监督学习不同,它不需要预先标记的训练数据。在无监督学习中,计算机仅根据样本的特征或样本间的相关性,从数据中自动发现隐藏的模式或结构。 …...
单片机-STM32部分:16、Git工具使用
Docshttps://x509p6c8to.feishu.cn/wiki/Pftrw3Z6niRlewkurnyctyw1nQx 使用Git管理本地仓库的好处是,可以知道自己每次修改了哪些内容,随时进行版本切换。 待完善。...
扬州卓韵酒店用品:优质洗浴用品,提升酒店满意度与品牌形象
在酒店提供的服务里,沐浴用品占据了非常重要的地位,其质量与种类直接关系到客人洗澡时的感受。好的沐浴用品能让客人洗澡时感到舒心和快乐,反之,质量不好的用品可能会影响客人整个住宿期间的愉悦心情。挑选恰当的洗浴用品不仅能够…...
Coze 实战教程 | 10 分钟打造你的AI 助手
> 文章中的 xxx 自行替换,文章被屏蔽了。 📱 想让你的xxx具备 AI 对话能力?本篇将手把手教你,如何用 Coze 平台快速构建一个能与用户自然交流、自动回复提问的 xxx助手,零代码、超高效! 📌…...
使用 frp 实现内网穿透:从基础到进阶
在日常开发中,我们经常会遇到需要将本地服务暴露给外部用户的情况,比如测试同学需要临时测试一个本地开发的 Web 服务,或者希望在出差时远程访问家里的 NAS。这些需求的核心问题都是如何实现内网穿透。 一、为什么选择 frp? 经过…...
redis中key的过期和淘汰
一、过期(redis主动删除) 设置了ttl过期时间的key,在ttl时间到的时候redis会删除过期的key。但是redis是惰性过期。惰性过期:redis并不会立即删除过期的key,而是会在获取key的时候判断key是否过期,如果发现…...
鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp
使用UniApp制作多选框与单选框组件 前言 在移动端应用开发中,表单元素是用户交互的重要组成部分。尤其是多选框(Checkbox)和单选框(Radio),它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供…...
和为target问题汇总
文章目录 习题题型1377.组合总和 IV 题型2494.目标和 和为target的问题,可以有很多种问题的形式的考察,当然,及时的总结与回顾有利于我们熟练掌握这些知识! 题型1 爬楼梯问题,是对于转移步伐有规定,在不同…...
Ubuntu使用Docker搭建SonarQube企业版(含破解方法)
目录 Ubuntu使用Docker搭建SonarQube企业版(含破解方法)SonarQube介绍安装Docker安装PostgreSQL容器Docker安装SonarQube容器SonarQube汉化插件安装 破解生成license配置agent 使用 Ubuntu使用Docker搭建SonarQube企业版(含破解方法ÿ…...