C# 委托:将方法作为参数传递的实战解析

月亮慢半拍
月亮慢半拍
发布时间:2026-10-15 | 6人浏览过
原创

在 C# 开发中,委托(Delegate)是一种重要的类型安全函数指针,允许将方法像变量一样传递。本文将通过定义打招呼功能的案例,分别演示如何在静态上下文和实例对象中使用委托,实现代码的灵活调度与解耦。

结果或目标

本教程旨在展示如何利用 delegate 关键字定义一种方法签名,并在业务逻辑中动态传入不同的问候方式(英文或中文),从而实现核心逻辑与应用细节的分离。

准备条件

操作前需确保已搭建好 C# 开发环境(如 Visual Studio 或 VS Code)。需要理解以下基础概念:

  • 委托声明:定义返回类型和参数列表的契约。
  • 方法匹配:被传入的方法必须完全符合委托定义的签名。
  • 作用域:区分静态成员(Static)与非静态成员(Instance)的访问方式。

真实操作顺序

第1步:定义委托类型

首先,定义一个名为 DoGreeting 的委托,它表示一个无返回值(void)且接收一个字符串参数的方法。这是后续所有操作的基础契约。

public delegate void DoGreeting(string name);

第2步:实现具体的问候方法

编写两个独立的方法,分别用于输出英文和中文问候。它们必须严格遵守第一步定义的签名:void Greeting*(string name)。

// 英文问候
private static void GreetingEnglish(string name)
{
    Console.WriteLine(name + " hello!");
}

// 中文问候
private static void GreetingChinese(string name)
{
    Console.WriteLine(name + " 你好!");
}

第3步:在静态上下文中使用委托

创建一个静态工具方法 MarkGreeting,它接受名称字符串和 DoGreeting 类型的委托作为参数。在 Main 入口中,直接将上述方法名作为参数传入。

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        // 将静态方法名直接作为参数传递
        MarkGreeting("张三", GreetingEnglish);
        MarkGreeting("李四", GreetingChinese);
    }

    private static void MarkGreeting(string name, DoGreeting markGreeting)
    {
        markGreeting(name); // 执行传入的委托方法
    }
}

第4步:在实例对象上下文中使用委托

当涉及面向对象设计时,可以将方法封装在类中。此时需要创建类的实例,并通过实例访问方法来绑定委托。

public class GreetingService
{
    public void MarkGreeting(string name, DoGreeting markGreeting)
    {
        markGreeting(name);
    }

    public void GreetingEnglish(string name) 
    {
        Console.WriteLine(name + " hello!");
    }

    public void GreetingChinese(string name) 
    {
        Console.WriteLine(name + " 你好!");
    }
}

// 调用示例
class Program
{
    static void Main() 
    {
        var service = new GreetingService();
        // 通过实例.方法名的方式传递
        service.MarkGreeting("王五", service.GreetingEnglish);
    }
}

完成判断

运行程序后,控制台应准确输出对应名字的问候语。若出现编译错误,请检查方法签名是否与 delegate 声明完全一致;若运行时出错,请确认传入的参数不为 null 且存在对应的内存对象。

简要总结

委托是 C# 中实现回调、事件和多播调用的基石。通过上述静态与实例两种模式的对比,可以看出其本质都是“将逻辑处理权移交”。这种方式极大地提高了代码的可扩展性,例如未来只需新增一个 GreetingGerman 方法并传入,无需修改核心逻辑即可支持新需求。 以上就是 C# 委托把方法当成参数的详细内容,更多关于 C# 基础编程技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表