当前位置: 首页 > news >正文

C#反射的应用案例与讲解

C# 反射


文章目录

  • C# 反射
  • 前言
  • 案例展示
    • 将对象转为字典
      • 测试用例
      • 执行效果
      • 代码讲解
    • HasValue扩展
      • 测试用例
      • 执行效果
      • 代码讲解
  • 反射的底层逻辑
    • 反射的原理
    • 反射的基本概念
    • 反射常用的API和方法
      • GetType类
      • Activator类
      • PropertyInfo类
      • EventInfo 类
      • MemberInfo类
      • MethodInfo类
  • 反射的优缺点
    • 优点
    • 缺点
  • 反射的性能问题
  • 总结


前言

反射在我们实际开发中其实比较常见的,比如我们接口对接时将对象序列化为json字符串和将对方传过来的json字符串序列化为我们的DTO对象,还有进行依赖注入的时候其实都用到的反射。下面我就来用实际开发案例的方法来给大家讲解一些C# 反射的用法和原理。


案例展示

将对象转为字典

实现代码:

Dictionary<string, object> dictionary = new Dictionary<string, object>();
if (obj != null)
{foreach (PropertyInfo property in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)){if (property.CanRead){Type type = property.PropertyType;if (type.IsValueType){dictionary[property.Name] = "";}else{if (type == typeof(string)){dictionary[property.Name] = property.GetValue(obj, null)??"";}else if (typeof(IEnumerable).IsAssignableFrom(type)){dictionary[property.Name] =JsonConvert.SerializeObject(property.GetValue(obj, null));}else if(type.IsClass){dictionary[property.Name] = JsonConvert.SerializeObject(property.GetValue(obj, null));}else{dictionary[property.Name] = property.GetValue(obj, null) ?? 0;}}}}
}
else
{throw new ArgumentNullException(nameof(obj));
}return dictionary;

测试用例

  public class HouseData{public float Size { get; set; }public string  msg { get; set; }public Test test { get; set; }public List<Test> TestList { get; set; }}public class Test{public string Test1 { get; set; }public string Test2 { get; set; }public int Number { get; set; }}static void Main(string[] args){Test test1 = new Test();test1.Test1 = "12321";test1.Test2 = "55555";test1.Number =132465;HouseData houseData = new HouseData();houseData.test = test1;houseData.TestList = new List<Test>();houseData.TestList.Add(test1);houseData.Size = 123;houseData.msg = "sssss";Dictionary<string, object> keyValues = ToDictionary(houseData);Console.WriteLine(JsonConvert.SerializeObject(keyValues));Console.Read();}

执行效果

在这里插入图片描述

代码讲解

  • 这里是循环对象中的属性,获取用public修饰的属性,这样私有变量就不会被进行序列化。
    在这里插入图片描述
  • 这里是反射对象的数据类型;下面的isValueType是判断该属性是否为值类型。
    在这里插入图片描述
  • 下面的Ienumerable是判断对象是否为可遍历类型,IsAssignableFrom是判断我们对象中属性类型是否继承于Ienumerable
    像List和Arry,这些数据类型都继承于Ienumerable。这里如果是继承自Ienumerable接口咱们就直接把它序列化为json字符串就可以了。
  • IsClass是判断该属性是否是一个类。如果是一个类咱们就可以直接把它序列化为json字符串就可以了。
    在这里插入图片描述

HasValue扩展

我们在代码编写过程中经常会遇到判断属性是否有值的情况,比如

  • String类型
if(string.IsNullOrWhiteSpace(strVal))

-List类型

 List<string> strings=new List<string>();if (strings != null && strings.Count > 0)

在编写代码的过程中我发现.netCore中的HasValue方法用起来还挺方便的
就像这样
在这里插入图片描述
但是只有int类型有这个属性其他类型就没有了,于是突发奇想要不自己写一个也方便使用。
以下代码是在.net 6框架中对值校验方法的补充,判断传入对象是否有值。

  public static class ValueVerifyExtend{public static bool HasValue<T>(this T? obj){if (obj == null)return false;Type type = obj.GetType();//判断值类型是否有值if (type.IsValueType){//上面已经判断过是否为null,如果不为null那么值类型就是一定有值的return true;}else{//判断引用类型是否有值if (obj is { }){if (type == typeof(string)){return !string.IsNullOrWhiteSpace(obj.ToString());}else if (typeof(IEnumerable).IsAssignableFrom(type)){IEnumerable? Enumerable = obj as IEnumerable;if (Enumerable != null){IEnumerator? enumerator = Enumerable.GetEnumerator();if (enumerator != null){return enumerator.MoveNext();}else{return false;}}else{return false;}}else if (typeof(IListSource).IsAssignableFrom(type) && !type.IsInterface){IListSource? listSource = obj as IListSource;if (listSource != null){IList list = listSource.GetList();return list.Count > 0;}else{return false;}}else if (typeof(DataRow).IsAssignableFrom(type)){DataRow? row = obj as DataRow;if (row != null){return row.ItemArray.Count() > 0;}else{return false;}}else{return false;}}else{return false;}}}}

测试用例

 int a = 0;Console.WriteLine("Int类型是否有值:" + a.HasValue());int? a1 = null;Console.WriteLine("Int类型是否有值:" + a1.HasValue());string str = "";Console.WriteLine("String类型是否有值:" + str.HasValue());string str1 = "123";Console.WriteLine("String类型是否有值:" + str1.HasValue());long? b = null;Console.WriteLine("Long类型是否有值:" + b.HasValue());long? b1 = 123465;Console.WriteLine("Long类型是否有值:" + b1.HasValue());List<string> strings=new List<string>();Console.WriteLine("List类型是否有值:" + strings.HasValue());strings.Add("123");Console.WriteLine("List类型是否有值:" + strings.HasValue());Dictionary<string,string> valuePairs=new Dictionary<string, string>();Console.WriteLine("Dictionary类型是否有值:" + valuePairs.HasValue());valuePairs.Add("rte", "resfas");Console.WriteLine("Dictionary类型是否有值:" + valuePairs.HasValue());Console.ReadLine();

执行效果

在这里插入图片描述

代码讲解

  • 方法中首先进行的是是否为NULL的判断,都为NULL就没必要再走后续代码去耗费性能了
    在这里插入图片描述
  • 后面就判断传入的类型是值类型还是引用类型。值类型和引用类型的判断方式是不一样的。
    (注意:在引用类型中string需要单独进行判断,它是一个特殊的引用类型。虽然它有值类型的特性,但在内存管理方面它表现得更像是引用类型)

反射的底层逻辑

经过上述的两个案例想必大家对反射的应用也有初步的了解了,接下来我们来看看反射的内部是怎么实现的。
首先咱们来看看C# 文件的编译过程
在这里插入图片描述
这里给大家补充一些小知识

  • IL/MSIL (Microsoft Intermediate Language) 微软中间语言 (IL是MSIL的缩写,译为中间语言)
    C#源代码通过LC转换为IL代码,IL主要包含一些元数据和中间语言指令JIT编译器把IL代码转为机器识别的机器代码,其实就相当于汇编语言

  • JIT (Just in time)即时编译器
    代码转换为本地机器代码,从而提高程序的执行效率和性能‌‌

  • CTS (Common Type System)通用类型系统
    一种规范,用于定义、使用和管理类型的系统。CTS确保所有编程语言在.NET框架中共享相同的数据类型,从而促进不同语言编写的应用程序和库之间的无缝通信‌ 例如:C#中的int和VB.NET中的Integer在编译后都会统一为Int32

  • CLS (Common Language Specification)公共语言规范
    CLS是一套规则,描述了支持.NET的编译器必须支持的最小的和完全的特征集,以生成可由CLR承载的代码

  • CLR (Common Language Runtime)公共语言运行时(也有的叫公共语言运行库)
    主要作用是定位、加载和管理.NET类型、内存管理、安全检查、线程管理等。.NET运行库提供了一个定义明确的运行库层,可以被支持.NET的所有语言和平台共享
    小知识参考自:
    https://www.cnblogs.com/djh5520/p/14286801.html
    https://blog.csdn.net/u010918911/article/details/130961425

反射的原理

反射是通过 System.Reflection 命名空间提供的类和接口实现的,它可以使我们在运行时获取程序集、模块、类型(类、接口、枚举等)的元数据,并能创建对象、调用方法、访问字段和属性等。 基于.NET的元数据和公共语言运行库(CLR)。当.NET程序编译时,所有的类型信息(包括类的定义、成员、继承信息等)都会被存储在可执行文件(如DLL或EXE)中的元数据部分。反射API能够读取这些元数据,因此可以动态地获取和使用类型信息。
在这里插入图片描述


反射的基本概念

反射主要包括以下几个核心概念:

  • 类型(Type): 类型是反射的基础,代表了在程序集中定义的类、接口、结构体等。类型提供了关于其成员(字段、方法、属性等)的详细信息。
  • 成员(Member): 成员是类型的组成部分,包括字段、属性、方法、事件等。
  • 属性(Property): 属性是类的成员,具有名称和值,通常用于封装字段。
  • 方法(Method): 方法是类的成员,定义了类的操作行为,包括函数和过程。
  • 参数(Parameter): 方法中的参数是传递给方法的值,用于指定方法如何执行操作。
  • Assembly(程序集): 程序集是编译后的代码库,它包含了类型和其他可重用类型定义。每个程序集都有一个唯一的标识符(Assembly Name)。
    参考自:
    https://blog.csdn.net/qq_35320456/article/details/135980899
    https://www.cnblogs.com/wugh8726254/p/17434403.html

反射常用的API和方法

GetType类

在这里插入图片描述

  • IsClass:类型判断是否为对象
  • Type.GetType(string fullName): 获取指定完全限定名的类型。
  • Type.GetType(string fullName, bool throwOnError): 获取指定完全限定名的类型,如果类型不存在,则根据布尔值决定是否抛出异常。
  • Type.GetTypeFromProgID(string progID): 从ProgID获取类型。
  • Type.GetTypeFromCLSID(Guid clsid): 从CLSID获取类型。

IsClass示例:

Type type = obj.GetType();
if(type.IsCalss)
{
....
} 

Type.GetType(string fullName)使用示例:
在上方案例中我们通过此方法获取对象中public修饰的属性。

obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)

Activator类

  • GetTypes():获取程序集中的所有类型
  • Assembly.LoadFile(string fileName): 从指定的文件加载程序集
  • CreateInstance()创建由指定泛型类型参数设计的类型的实例
  • Assembly.GetExecutingAssembly(): 获取当前执行的程序集。

CreateInstance()示例:
通过此方法创建由指定泛型类型参数设计的类型的实例,通常在我们编写SDK的时候用到,需要注意的是该方法时通过调用无参构造是现实的创建对象实例。

 private T DoSend<T>(IBaseReq<T> request, Dictionary<string, string> Headers = null,string mediaType= "application/json") where T : BaseRes{var rspModel = Activator.CreateInstance<T>();
}

PropertyInfo类

  • PropertyInfo.GetValue():获取属性的值。
  • PropertyInfo.SetValue():设置属性的值。
  • PropertyInfo.CanRead:检查属性是否可读。
  • PropertyInfo.CanWrite:检查属性是否可写。

PropertyInfo.GetValue()示例:
在我们的案例中其实我们也用到了该类中的方法,就在这里
在这里插入图片描述


EventInfo 类

  • EventInfo.AddEventHandler(object obj, Delegate handler): 订阅事件。
  • EventInfo.RemoveEventHandler(object obj, Delegate handler): 取消订阅事件。

EventInfo.AddEventHandler(object obj, Delegate handler) 使用案例

using System;
using System.Reflection;public class MyClass
{public event EventHandler MyEvent;public void TriggerEvent(){MyEvent(this, EventArgs.Empty);}
}public class Program
{public static void Main(){MyClass myClassInstance = new MyClass();EventInfo eventInfo = typeof(MyClass).GetEvent("MyEvent");// 创建事件处理程序EventHandler eventHandler = (sender, e) => Console.WriteLine("Event triggered.");// 附加事件处理程序eventInfo.AddEventHandler(myClassInstance, eventHandler);// 触发事件myClassInstance.TriggerEvent();}
}

在这个例子中,我们定义了一个名为 MyClass 的类,它有一个名为 MyEvent 的事件。然后,在 Program 类的 Main 方法中,我们使用反射获取 MyEvent 的 EventInfo 对象,并使用 AddEventHandler 方法将事件处理程序附加到该事件上。当我们调用 myClassInstance.TriggerEvent() 方法触发事件时,附加的事件处理程序会被执行,在控制台上打印出 “Event triggered.”。


MemberInfo类

  • MemberInfo.GetHashCode():获取成员的哈希码
  • MemberInfo.Equals():比较两个成员是否相等
  • MemberInfo.Name: 获取成员的名称
  • MemberInfo.GetCustomAttributes(Type attributeType, bool inherit) / MemberInfo.GetCustomAttributes(): 获取成员的自定义属性。

MemberInfo.GetCustomAttributes使用案例

using System;
using System.Reflection;public class MyAttribute : Attribute
{public string Name { get; private set; }public MyAttribute(string name){this.Name = name;}
}public class MyClass
{[MyAttribute("Attribute1")]public void MyMethod() { }
}class Program
{static void Main(){MethodInfo methodInfo = typeof(MyClass).GetMethod("MyMethod");MyAttribute[] attributes = (MyAttribute[])methodInfo.GetCustomAttributes(typeof(MyAttribute), false);foreach (MyAttribute attribute in attributes){Console.WriteLine(attribute.Name);}}
}

在这个例子中,我们定义了一个名为 MyAttribute 的自定义属性,并将其应用于 MyClass 类的 MyMethod 方法上。然后,我们使用 GetMethod 获取 MethodInfo 对象,并使用 GetCustomAttributes 获取应用在该方法上的所有 MyAttribute 实例


MethodInfo类

  • MethodInfo.MethodInfo 类用于操作方法。
  • MethodInfo.Invoke():调用方法。
  • MethodInfo.GetParameters():获取方法的参数。
  • MethodInfo.IsStatic:检查方法是否为静态。

MethodInfo.Invoke() 使用案例:

using System;
using System.Reflection;public class Calculator
{public int Add(int a, int b){return a + b;}public int Subtract(int a, int b){return a - b;}
}class Program
{static void Main(string[] args){Calculator calculator = new Calculator();Type calculatorType = calculator.GetType();MethodInfo addMethod = calculatorType.GetMethod("Add");MethodInfo subtractMethod = calculatorType.GetMethod("Subtract");int resultAdd = (int)addMethod.Invoke(calculator, new object[] { 1, 2 });int resultSubtract = (int)subtractMethod.Invoke(calculator, new object[] { 3, 1 });Console.WriteLine($"Add result: {resultAdd}");Console.WriteLine($"Subtract result: {resultSubtract}");}
}

假设我们有一个名为Calculator的类,它有两个方法Add和Subtract,我们将使用反射来调用这些方法


反射的优缺点

优点

  • 动态加载类型和程序集。

  • 运行时检查对象的类型。

  • 动态创建对象,调用方法,以及访问字段和属性。

  • 动态构建 late-binding 方法调用。

缺点

  • 性能问题:反射相当于多次间接访问,通常比直接调用慢。

  • 安全问题:使用反射时可以执行任何 private 或 internal 成员,可能破坏封装性和安全性。

  • 复杂的部署:应用程序依赖于程序集版本时,需要确保正确的程序集被加载。

  • 代码可读性和维护性差:反射的代码通常难以阅读和理解。

反射的性能问题

想必大家经常会听到反射会影响性能,是的没错,它确实是会影响性能,主要原因是它要进行权限判断,拆箱操作,查找方法等一系列操作。但是只要合理的运用也能尽可能的减少对性能的影响,比如 缓存反射信息,减少反射调用次数等。

总结

其实有的时候我也在考虑有没有必要这样刨根问底,换个思考方式就像铁匠去研究锤子的铁是由什么元素组成的一样,其实他就是个打铁的根本没必要去做这些事只要打好自己的铁就可以了。但是古人又说了,不能知其然要知其所以然。奇奇怪怪。

相关文章:

C#反射的应用案例与讲解

C# 反射 文章目录 C# 反射前言案例展示将对象转为字典测试用例执行效果代码讲解 HasValue扩展测试用例执行效果代码讲解 反射的底层逻辑反射的原理反射的基本概念反射常用的API和方法GetType类Activator类PropertyInfo类EventInfo 类MemberInfo类MethodInfo类 反射的优缺点优点…...

Mysql常见知识点

Mysql是最常用的数据库了。 1、什么是关系型数据库&#xff1f; 关系型数据库&#xff08;RDB&#xff0c;Relational Database&#xff09;就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#…...

玩转 JMeter:Random Order Controller让测试“乱”出花样

嘿&#xff0c;各位性能测试的小伙伴们&#xff01;今天咱要来唠唠 JMeter 里超级有趣又超实用的 Random Order Controller&#xff08;随机顺序控制器&#xff09;&#xff0c;它就像是性能测试这场大戏里的“魔术棒”&#xff0c;轻轻一挥&#xff0c;就能让测试场景变得千变…...

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端&#xff0c;使用AMQP协议。 RabbitMQ是一个基于AMQP&#xff08;高级消息队列协议&#xff09;实现的开源消息组件&#xff0c;它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…...

计算机网络 (37)TCP的流量控制

前言 计算机网络中的TCP&#xff08;传输控制协议&#xff09;流量控制是一种重要机制&#xff0c;用于确保数据在发送方和接收方之间的传输既高效又稳定。 一、目的 TCP流量控制的主要目的是防止发送方发送数据过快&#xff0c;导致接收方无法及时处理&#xff0c;从而引起数据…...

Windows10下安装vue2.0项目所需环境

一、Node.js版本管理器NVM安装 1.下载NVM安装包 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。目前最新版…...

使用Cilium/eBPF实现大规模云原生网络和安全

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 抽象 1 Trip.com 云基础设施 1.1 分层架构 1.2 更多细节 2 纤毛在 Trip.com 2.1 推出时间表 2.2 自定义 2.3 优化和调整 2.3.1 解耦安装 2.3.2 避免重试/重启风暴 2.3.3 稳定性优先 2…...

SQL美化器优化

文章目录 1.目录2.代码 1.目录 2.代码 package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.*…...

网络基础1 http1.0 1.1 http/2的演进史

http1.0 1.1 http/2的演进史&#x1f60e; &#xff08;连接复用 队头阻塞 服务器推送 2进制分帧&#xff09; 概述 我们主要关注的是应用层 传输层 http协议发展历史 http的报文结构&#xff1a;起始行 Header Body http的典型特征 http存在的典型问题 Keep Alive机制 chun…...

MySQL不使用子查询的原因

MySQL不使用子查询的原因及优化案例 目录 MySQL不使用子查询的原因及优化案例 目录不推荐使用子查询和JOIN的原因解决方案优化案例 案例1&#xff1a;查询所有有库存的商品信息案例2&#xff1a;使用EXISTS优化子查询案例3&#xff1a;使用JOIN代替子查询案例4&#xff1a;优化…...

网络编程(1)

网络编程概述 Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;联网的底层细节被隐藏在 Java 的本机安装系统里&#…...

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…...

【python:文件->统计飞鸟集单词个数】

主函数.py fopen("飞鸟集.txt",r,encoding"UTF-8")#只读方式打开 contentf.read()# 提取全文,将文件内容字符串对象返回给content dccontent.split("\n")#对字符串调用分割符切割 print(dc) f.close() # 统计单词频率 ofnumcontent.count("…...

解决SpringBoot无法使用JDK8问题

解决SpringBoot无法使用JDK8问题 现状解决方案 现状 使用idea创建springboot项目无法选择java8。原因是23年11月的spring更新后就明确了不在支持java8版本的项目创建&#xff0c;但是目前为止很多公司开发还在用java8&#xff0c;导致会有问题的产生。 解决方案 使用idea创…...

论文导读 | 数据库系统中基于机器学习的基数估计方法

背景 基数估计任务是在一个查询执行之前预测其基数&#xff0c;基于代价的查询优化器&#xff08;Cost Based Optimizer&#xff09;将枚举所有可能的执行计划&#xff0c;并利用估计的基数选出期望执行代价最小的计划&#xff0c;从而完成查询优化的任务。 然而&#xff0c;…...

Shader->LinearGradient线性渐变着色器详解

XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…...

Unity打包+摄像机组件

转换场景 使用程序集&#xff1a;using UnityEngine.SceneManagement; 切换场景相关代码&#xff1a;SceneManager.LoadScene(1);//括号内可放入场景名称&#xff0c;场景索引等 //Application.LoadLevel(""); 老版本Unity加载场景方法 打包相关 Bundle Identi…...

Git 命令代码管理详解

一、Git 初相识&#xff1a;版本控制的神器 在当今的软件开发领域&#xff0c;版本控制如同基石般重要&#xff0c;而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造&#xff0c;最初是为了更好地管理 Linux 内核源代码。随着时间的推移&#xff0c;Git 凭借…...

游戏引擎学习第78天

Blackboard: Position ! Collision “网格” 昨天想到的一个点&#xff0c;可能本来就应该想到&#xff0c;但有时反而不立即思考这些问题也能带来一些好处。节目是周期性的&#xff0c;每天不需要全程关注&#xff0c;通常只是在晚上思考&#xff0c;因此有时我们可能不能那么…...

Centos9-SSH免密登录配置-修改22端口-关闭密码登录-提高安全性

Centos9-SSH免密登录配置-修改22端口-关闭密码登录 生成秘钥对将公钥信息存进authorized_keys测试登录查询访问记录、比对指纹更换22访问端口关闭账号密码登录生成秘钥对 生成密钥对,指定 备注 和 文件目录命令执行后,默认两次回车,不设置秘钥使用密码ssh-keygen -t rsa -b …...

汇总统计数据--SQL中聚集函数的使用

目录 1、为什么需要汇总数据 2、聚集函数 &#xff08;1&#xff09;AVG函数 &#xff08;2&#xff09;COUNT函数 &#xff08;3&#xff09;MAX和MIN函数 &#xff08;4&#xff09;SUM函数 3、聚集不同值--DISTINCT 4、组合聚集函数 5、小结 博主用的是mysql8 DBMS…...

pdf提取文本,表格以及转图片:spire.pdf

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380; 1. pdfbox1.1导入pdfbox 的maven依赖1.1 提取文本1.2 提取文本表格&#xff08;可自行加入逻辑处理&#xff09;1.3 pdf转换成图片代码&…...

【C#学习笔记】C#中委托

概述 C#的委托是一种类型安全的函数指针&#xff0c;用于引用方法&#xff0c;委托允许方法作为参数传递&#xff0c;或者将方法赋值给委托变量&#xff0c;并通过委托调用方法。 委托类型&#xff1a;委托定义了方法的的签名&#xff08;[方法的参数类型和返回值]&#xff0…...

C#的Task

优先使用Task.Run&#xff0c;除非有定制化需求才用Task.Factory.StartNew Task.Factory.StartNew的TaskScheduler参数颠覆你的认知&#xff1a; var cnt 0;var cancelToken new CancellationTokenSource();await Task.Factory.StartNew(() > {cnt;Debug.WriteLine($&quo…...

企业全文搜索-搜索权限,非侵入文档同步,权限同步 ,扩展字段

简介 企业全文搜索帮助员工高效快速定位所需的信息和资源,搜索权限控制是必须的,原因有二,首先,企业文档,包括公文,流程,技术文档等,带有敏感信息,搜索返回带片段,可能带出敏感信息;其次,若没有权限,用户搜索出来的文档可能不能阅读原文,体验非常差。onesearch有…...

Linux电源管理——CPUidle Framework

目录 前言 一、CPU idle 二、cpuidle framework 相关概念 三、cpuidle core 数据结构 3.1、cpuidle_state 3.2、cpuidle_driver 3.3、cpuidle_device 3.4、cpuidle_governor 四、cpuidle driver初始化流程 4.1、cpuidle driver 初始化方式 4.2、drv->states[0]的初…...

【黑灰产】假钱包推广套路

假钱包推广产业链研究 市面上钱包的主要推广方式&#xff1a; 1&#xff0c;竞价&#xff08;搜索引擎&#xff09;&#xff0c;误导客户为真正官方钱包从而完成下载使用 优点&#xff1a;精准&#xff0c;客户大 缺点&#xff1a;竞价户容易挂&#xff0c;投资大 2&#xff0…...

联想java开发面试题及参考答案

IP 协议是哪一层的? IP 协议(Internet Protocol)属于网络层协议。 网络层主要负责将数据从源节点传输到目标节点,它在整个网络通信体系中起到了承上启下的关键作用。在分层网络模型中,下层(如数据链路层)为网络层提供物理链路的连接和帧传输服务。数据链路层关注的是在相…...

C# 继承(接口)

接口 如果一个类派生与一个接口&#xff0c;它就会执行某些函数。并不是所有的面向对象语言都支持接口。 熟悉COM的开发人员应注意&#xff0c;尽管在概念上C#接口类似于COM接口&#xff0c;但他们是不筒的&#xff0c;底层的结构不筒。比如&#xff0c;C#接口并不派生于IUnko…...

FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )

以Xilinx 公司Virtex-II 系列FPGA 为例&#xff0c;其基本结构由下图所示。它是主要由两大部分组成&#xff1a;可编程输入/输出&#xff08;Programmable I/Os&#xff09;部分和内部可配置&#xff08;Configurable Logic&#xff09;部分。 可编程输入/输出&#xff08;I/Os…...

妙用编辑器:把EverEdit打造成一个编程学习小环境

1 妙用编辑器&#xff1a;把EverEdit打造成一个编程学习小环境 1.1 应用场景 最近在学习Python语言&#xff0c;由于只是学习和练习&#xff0c;代码规模很小&#xff0c;不想惊动PyCharm、VSCode、WingIDE这些重型武器&#xff0c;只想轻快的敲些代码&#xff0c;记事本虽好&…...

ELK日志分析实战宝典之ElasticSearch从入门到服务器部署与应用

目录 ELK工作原理展示图 一、ElasticSearch介绍&#xff08;数据搜索和分析&#xff09; 1.1、特点 1.2、数据组织方式 1.3、特点和优势 1.3.1、分布式架构 1.3.2、强大的搜索功能 1.3.3、数据处理与分析 1.3.4、多数据类型支持 1.3.5、易用性与生态系统 1.3.6、高性…...

【学习笔记】理解深度学习和机器学习的数学基础:数值计算

深度学习作为人工智能领域的一个重要分支&#xff0c;其算法的实现和优化离不开数值计算。数值计算在深度学习中扮演着至关重要的角色&#xff0c;它涉及到如何在计算机上高效、准确地解决数学问题。本文将介绍深度学习中数值计算的一些关键概念和挑战&#xff0c;以及如何应对…...

【Java回顾】Day5 并发基础|并发关键字|JUC全局观|JUC原子类

JUC全称java.util.concurrent 处理并发的工具包(线程管理、同步、协调) 一.并发基础 多线程要解决什么问题&#xff1f;本质是什么&#xff1f; CPU、内存、I/O的速度是有极大差异的&#xff0c;为了合理利用CPU的高性能&#xff0c;平衡三者的速度差异&#xff0c;解决办法…...

VSCODE使用Echarts组件库(不是vue)

第一步打开Echarts官网 Examples - Apache ECharts 第二步随便点击一个图形点击我圈的按钮 第三步...

DNS解析域名简记

域名通常是由: 权威域名.顶级域名.根域名组成的。 从左往右&#xff0c;级别依次升高&#xff0c;这和外国人从小范围到大范围的说话习惯相关。&#xff08;我们自己是更习惯先说大范围再说小范围&#xff0c;如XX省XX市XX区XX路&#xff09; DNS解析域名时&#xff0c;会先查…...

选择器css

1.a标签选择 // 选中所具有herf 的元素 [herf] {color: skyblue; } // 选中所具有herfhttps://fanyi.youdao.com/ 的元素 [herf$"youdao.com"] {color:pink; } // 按此顺序书写 link visited hover active // 未访问状态 a:link {color:orange } // 访问状态 a…...

9.4 visualStudio 2022 配置 cuda 和 torch (c++)

一、配置torch 1.Libtorch下载 该内容看了【Libtorch 一】libtorchwin10环境配置_vsixtorch-CSDN博客的博客&#xff0c;作为笔记用。我自己搭建后可以正常运行。 下载地址为windows系统下各种LibTorch下载地址_libtorch 百度云-CSDN博客 下载解压后的目录为&#xff1a; 2.vs…...

ASP.NET Core 实现微服务 -- Polly 服务降级熔断

在我们实施微服务之后&#xff0c;服务间的调用变的异常频繁。多个服务之间可能是互相依赖的关系。某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败&#xff0c;进而影响到某个业务服务处理失败。某一个服务调用失败轻则造成当前相关业务无法处理&#xff1…...

2_CSS3 背景 --[CSS3 进阶之路]

CSS3 中的背景属性提供了许多强大的功能来增强网页设计&#xff0c;包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…...

于交错的路径间:分支结构与逻辑判断的思维协奏

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节内容很多&#xff0c;文章字数达到了史无前例的一万一&#xff0c;我们要来学习分支与循环结构中…...

升级 CentOS 7.x 系统内核到 4.4 版本

问题描述 在 CentOS 7.x 系统中&#xff0c;默认内核版本是 3.10.x&#xff0c;这个版本可能会带来一些与 Docker 和 Kubernetes 兼容性的问题&#xff0c;导致系统性能不稳定或功能异常。为了提高系统的稳定性和兼容性&#xff0c;建议升级到更高版本的内核&#xff0c;例如 …...

MySQL数据导出导入

一、数据导出 1.导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines--default-character-setutf8 --lock-all-tables --add-drop-database -A >db.all.sql 2.导出指定库到本地的目录(例如mysql库) mysqldump -u$USER -p$PASSWD -h127.…...

【机器学习:八、逻辑回归】

逻辑回归&#xff08;Logistic Regression&#xff09; 1. 逻辑回归的引出 在现实世界中&#xff0c;许多问题都涉及到分类任务。例如&#xff1a; 判断一封邮件是否为垃圾邮件&#xff1b;预测某人是否会患某种疾病&#xff1b;确定图片中是否包含某种特定物体。 这些问题…...

uniapp使用sm4加密

安装&#xff1a;npm install sm-crypto --save 1、在utils下新建crypto.js文件 // sm4 加密 export function encryption(params) {const SM4 require("sm-crypto").sm4const key 0123456789abcdeffedcba9876543212; // 提供的密钥const iv fedcba9876543210012…...

【STM32-学习笔记-1-】GPIO

文章目录 GPIOⅠ、GPIO函数Ⅱ、GPIO_InitTypeDef结构体参数①、GPIO_Mode②、GPIO_Pin③、GPIO_Speed GPIO Ⅰ、GPIO函数 // 将指定的GPIO端口寄存器重置为默认值 void GPIO_DeInit(GPIO_TypeDef* GPIOx);// 将GPIO的备用功能寄存器重置为默认值 void GPIO_AFIODeInit(void);…...

C#中的运算符和类--06

目录 一.运算符 1.赋值运算符 2.算数运算符 3.关系运算符 4.逻辑运算符 5.位运算符 6.三元运算符 7.空合并运算符 8.其他运算符 二.类 1.普通类 2.静态类 3.抽象类 4.密封类 5.部分类 6.泛型类 7.嵌套类 8.记录类 9.接口 一.运算符 1.赋值运算符 定义:赋值…...

【微服务】面试 2、服务雪崩

服务雪崩概念 主要内容&#xff1a;在微服务项目中&#xff0c;微服务间存在远程调用。若某一服务&#xff08;如服务 d&#xff09;出现故障&#xff0c;调用它的服务&#xff08;如服务 a&#xff09;会失败。若调用方持续向故障服务发起请求&#xff0c;由于服务连接数有限且…...

“深入浅出”系列之QT:(6)如何在一个项目中调用另一个项目

在Qt中&#xff0c;如果想在一个项目中调用另一个项目&#xff0c;这通常意味着想要在一个CMake构建的项目中集成或依赖另一个CMake构建的项目。 1‌.子模块或子目录方式‌&#xff1a; 如果另一个项目可以作为一个子模块或子目录包含在当前项目中&#xff0c;可以使用add_sub…...

计算机网络—地址与子网(IPv4)相关知识总结

前言 为了更加清楚的了解该相关知识&#xff0c;下面是发现的一些宝藏博主的博客。 彻底搞懂网络地址、广播地址、主机地址、网关、子网掩码、网络号、主机号 - lipga - 博客园 IP地址&#xff08;分类&#xff09;、子网掩码、网络号、主机号、子网号_网络号,主机号,子网号…...