在C#中,事件是一种使类或对象能够通知其他类或对象发生了某些事情的机制。它基于委托(Delegate)和事件(Event)的发布/订阅模式。事件发布者负责声明事件并触发它,而事件订阅者则负责处理事件。
在创建事件之前,首先需要声明一个委托类型,它定义了事件处理程序的签名。
C#public delegate void EventHandler(string message);
使用委托,我们可以声明一个事件。
C#public class Publisher
{
// 声明事件
public event EventHandler OnPublish;
// 触发事件的方法
public void Publish(string message)
{
// 检查是否有订阅者
if (OnPublish != null)
{
OnPublish(message);
}
}
}
在C#中,委托是一种类型,它安全地封装了一个方法的引用。委托可以用来实现回调函数和事件订阅。C# 提供了两种内置的委托类型:Action 和 Func。这些内置委托使得代理使用起来更加简单和灵活,有了这个基本不用自己声明delegate 了。
Action 是一个不返回值的委托类型,它可以有0到16个参数。当你需要一个执行操作但不返回结果的委托时,可以使用 Action。
C#namespace AppActionFunc
{
internal class Program
{
static void Main(string[] args)
{
Action printHello = () => Console.WriteLine("Hello, World!");
printHello();
Console.ReadKey();
}
}
}
在 C# 中,事件是一种使类或对象能够通知其他类或对象发生了某些情况的机制。它们是基于委托的发布-订阅模式的实现。事件处理器(也称为事件监听器)是响应事件发生而被调用的方法,其实想明白了都是方法的回调,这块很重要,现在的开发基本以这种模式居多了。
在 C# 中,事件是使用委托类型来声明的。委托定义了事件处理器的签名,即事件处理器需要匹配的参数类型和返回类型。
C#// 定义事件处理器委托
public delegate void EventHandler(object sender, EventArgs e);
C#public class Publisher
{
// 使用 EventHandler 委托声明事件
public event EventHandler MyEvent;
// 触发事件的方法
protected virtual void OnMyEvent()
{
// 如果有方法订阅了事件,则调用
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
在 C# 中,委托是一种类型,它定义了方法的签名(即方法的参数和返回类型),并且可以持有对符合该签名的方法的引用。简而言之,委托是对方法的封装,它允许将方法作为参数传递,或者将方法赋给变量。
委托特别适用于实现回调方法和多播功能。它们在事件处理中也起着核心作用。
委托的定义类似于定义一个方法,但是使用 delegate 关键字,并且没有方法体。
C#public delegate void PrintDelegate(string message);
在这个例子中,我们定义了一个委托 PrintDelegate,它可以引用任何接受单个 string 参数并返回 void 的方法。
要使用委托,首先需要定义一个符合委托签名的方法,然后创建委托的实例,并将该方法作为参数传递给委托。
C#namespace AppDelegate
{
internal class Program
{
public delegate void PrintDelegate(string message);
static void Main()
{
// 定义一个符合委托签名的方法
void PrintToConsole(string message)
{
Console.WriteLine(message);
}
// 创建委托实例并传递方法
PrintDelegate printDelegate = new PrintDelegate(PrintToConsole);
// 使用委托调用方法
printDelegate("Hello, World!");
Console.ReadKey();
}
}
}
C# 中的泛型(Generics),这是一种允许程序员创建灵活、可重用的代码的功能。我们将了解泛型的基本概念、为什么要使用泛型、如何定义和使用泛型类和方法,以及泛型的一些高级特性。本课程将通过丰富的示例帮助您掌握泛型的使用,简单理解可以是一种模板。
泛型允许我们创建不指定具体数据类型的类、接口、方法和委托。通过使用泛型,我们可以编写更加灵活和可重用的代码。