C#委托、事件、反射与特性相关
C#委托
委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过使用委托实例调用方法,就像调用常规方法一样。
特点:
- 委托类似于C++函数指针,但与指针不同的是,委托是完全面向对象的,是安全的数据类型。
- 委托允许将方法作为参数进行传递。
- 委托可用于定义回调方法。
- 委托可以把多个方法关联到一起。这样,在事件触发时可同时启动多个事件处理程序。
- 委托签名不需要于方法精准匹配。
C#四种委托的异同?
- delegate 至少0个参数,至多32个参数,可以无返回值,可以指定返回值类型。
- Action 至少0个参数,无返回值的泛型委托。
- Func 至少0个参数,至多16个参数,必须有返回值的泛型委托。
- Predicate 有且只有一个参数,返回值只为 bool 类型。
integrationperformancetest
public delegate void SimpleDelegate(string message);
class Program
{
public static void Hello(string name)
{
Console.WriteLine("Hello, " + name);
}
public static void Goodbye(string name)
{
Console.WriteLine("Goodbye, " + name);
}
static void Main(string[] args)
{
SimpleDelegate delegateInstance;
// 实例化时指向Hello方法
delegateInstance = new SimpleDelegate(Hello);
delegateInstance("World"); // 输出: Hello, World
// 直接使用匿名方法指向不同行为
delegateInstance = delegate (string name) { Console.WriteLine("Greetings, " + name); };
delegateInstance("User"); // 输出: Greetings, User
// 使用Lambda表达式指向Goodbye方法
delegateInstance = (name) => Goodbye(name);
delegateInstance("Guest"); // 输出: Goodbye, Guest
}
C#事件
类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发布者”,接收(或处理)事件的类称为“订阅者”。事件是一种特殊的委托。
C#反射
反射是.NET框架提供的一种动态特性,它允许程序在运行时,动态地获取程序集、类型、成员、字段、属性、方法等元数据,从而实现对程序运行时的动态处理。 详情阅读:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/reflection
反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。 如果代码中使用了特性,可以利用反射来访问它们。
简单例子:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);//输出:System.Int32。
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);//输出:System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
C#特性
特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。 一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。