跳到主要内容

C# Action 委托

介绍

在 C# 中,委托(Delegate)是一种类型安全的函数指针,它允许你将方法作为参数传递或存储。Action 委托是 .NET 框架中预定义的一种委托类型,专门用于表示没有返回值的方法。它通常用于需要执行某些操作但不需要返回结果的场景。

Action 委托的签名如下:

csharp
public delegate void Action();

这意味着 Action 委托可以指向一个没有参数且没有返回值的方法。如果需要传递参数,可以使用泛型版本的 Action<T>,例如 Action<int> 表示接受一个 int 参数的方法。

基本用法

无参数的 Action 委托

以下是一个简单的示例,展示了如何使用 Action 委托:

csharp
using System;

class Program
{
static void Main()
{
// 定义一个 Action 委托并指向一个方法
Action greet = Greet;

// 调用委托
greet();
}

static void Greet()
{
Console.WriteLine("Hello, World!");
}
}

输出:

Hello, World!

在这个示例中,Action 委托 greet 指向了 Greet 方法,调用 greet() 时,实际上执行了 Greet 方法。

带参数的 Action 委托

如果需要传递参数,可以使用泛型版本的 Action<T>。例如,以下代码展示了如何使用 Action<int> 委托:

csharp
using System;

class Program
{
static void Main()
{
// 定义一个 Action<int> 委托并指向一个方法
Action<int> printNumber = PrintNumber;

// 调用委托并传递参数
printNumber(42);
}

static void PrintNumber(int number)
{
Console.WriteLine($"The number is: {number}");
}
}

输出:

The number is: 42

在这个示例中,Action<int> 委托 printNumber 指向了 PrintNumber 方法,调用 printNumber(42) 时,传递了一个整数参数并执行了 PrintNumber 方法。

实际应用场景

事件处理

Action 委托常用于事件处理。例如,在 GUI 应用程序中,按钮点击事件通常使用 Action 委托来处理。

csharp
using System;

class Button
{
public event Action Click;

public void OnClick()
{
Click?.Invoke();
}
}

class Program
{
static void Main()
{
Button button = new Button();

// 订阅点击事件
button.Click += () => Console.WriteLine("Button clicked!");

// 模拟按钮点击
button.OnClick();
}
}

输出:

Button clicked!

在这个示例中,Button 类定义了一个 Click 事件,使用 Action 委托来表示事件处理程序。当按钮被点击时,调用 OnClick 方法触发事件。

回调函数

Action 委托还可以用于实现回调函数。例如,在异步编程中,可以使用 Action 委托来指定操作完成后的回调。

csharp
using System;
using System.Threading.Tasks;

class Program
{
static void Main()
{
// 调用异步方法并指定回调
DoSomethingAsync(() => Console.WriteLine("Operation completed!"));
}

static async Task DoSomethingAsync(Action callback)
{
await Task.Delay(1000); // 模拟异步操作
callback();
}
}

输出:

Operation completed!

在这个示例中,DoSomethingAsync 方法接受一个 Action 委托作为回调函数,在异步操作完成后调用该回调。

总结

Action 委托是 C# 中一种非常有用的工具,特别适合用于表示没有返回值的方法。它可以用于事件处理、回调函数等多种场景。通过使用 Action 委托,你可以编写更加灵活和可重用的代码。

提示

如果你需要表示带有返回值的方法,可以考虑使用 Func 委托。Func 委托与 Action 类似,但它可以返回一个值。

附加资源

练习

  1. 创建一个 Action<string> 委托,指向一个方法,该方法接受一个字符串参数并打印出来。
  2. 修改上面的按钮示例,使其在点击时打印出点击次数。
  3. 尝试使用 Action 委托实现一个简单的回调机制,模拟文件下载完成后的通知。

通过完成这些练习,你将更好地理解 Action 委托的用法和应用场景。