C# 委托和事件

文章介绍了C#中的委托概念,作为方法引用的类型,允许以更灵活的方式传递方法。委托可以单播或多播,文中给出了单播和多播的示例。事件是特殊的委托,提供安全的类间通信方式,只能在内部触发,具有封装和安全特性。文章通过示例展示了如何定义、使用和触发事件。
摘要由CSDN通过智能技术生成

目录

委托        

事件        


委托        

        在C#中,委托是一种类型,用于表示指向方法的引用。简单来说,委托是一种可以将方法作为参数传递给其他方法的类型。委托可以看作是一种“函数指针”,它可以使程序员以更加灵活的方式编写代码。

        下面是一个简单的委托示例,其中定义了一个委托类型“CalculateHandler”,它可以接受两个int类型参数并返回一个int类型值:

delegate int CalculateHandler(int x, int y);

class Program
{
    static void Main(string[] args)
    {
        // 创建委托实例
        CalculateHandler add = new CalculateHandler(Add);

        // 调用委托实例
        int result = add(1, 2);
        Console.WriteLine(result);
    }

    // 定义一个方法用于计算两个数的和
    static int Add(int x, int y)
    {
        return x + y;
    }
}

        在上面的代码中,我们首先定义了一个委托类型“CalculateHandler”,它可以接受两个int类型参数并返回一个int类型值。然后我们创建了一个委托实例“add”,它引用了一个名为“Add”的方法。最后,我们调用了委托实例“add”,并将参数1和2传递给它,它返回了它调用的方法的结果。

        需要注意的是,委托可以用于多播(即将多个方法绑定到一个委托实例上)。下面是一个多播委托的示例:

delegate void PrintHandler(string message);

class Program
{
    static void Main(string[] args)
    {
        // 创建委托实例
        PrintHandler print = new PrintHandler(Print);

        // 将多个方法绑定到委托实例上
        print += new PrintHandler(PrintUpperCase);
        print += new PrintHandler(PrintLowerCase);

        // 调用委托实例,它将调用绑定的所有方法
        print("Hello, World!");
    }

    static void Print(string message)
    {
        Console.WriteLine(message);
    }

    static void PrintUpperCase(string message)
    {
        Console.WriteLine(message.ToUpper());
    }

    static void PrintLowerCase(string message)
    {
        Console.WriteLine(message.ToLower());
    }
}

        在上面的代码中,我们首先定义了一个委托类型“PrintHandler”,它可以接受一个string类型参数并返回void。然后我们创建了一个委托实例“print”,它引用了一个名为“Print”的方法。接着,我们将另外两个方法“PrintUpperCase”和“PrintLowerCase”绑定到了委托实例“print”上。最后,我们调用了委托实例“print”,它将依次调用绑定的所有方法。


事件        

        在C#中,事件是一种特殊的委托,它允许类或对象在某些情况下通知其他类或对象发生了某些事情。事件是一种更加安全和灵活的方式,可以使类或对象更好地与其他类或对象进行通信。

以下是一个简单的事件示例,其中定义了一个名为“ButtonClick”的事件:

class Button
{
    // 定义一个名为“ButtonClick”的事件
    public event EventHandler ButtonClick;

    // 触发事件的方法
    public void Click()
    {
        if (ButtonClick != null)
        {
            ButtonClick(this, EventArgs.Empty);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Button button = new Button();

        // 订阅事件
        button.ButtonClick += new EventHandler(OnButtonClick);

        // 触发事件
        button.Click();
    }

    static void OnButtonClick(object sender, EventArgs e)
    {
        Console.WriteLine("Button clicked!");
    }
}

        在上面的代码中,我们定义了一个名为“Button”的类,它包含一个名为“ButtonClick”的事件。当用户单击按钮时,我们调用了“Click”方法来触发“ButtonClick”事件。在程序的主函数中,我们创建了一个Button对象,并订阅了“ButtonClick”事件,然后调用了“Click”方法来触发该事件。在事件处理程序“OnButtonClick”中,我们输出了一条消息来表示按钮已被单击。

        需要注意的是,事件和委托之间的主要区别在于事件只能在类或对象内部触发,而委托可以在任何地方触发。此外,事件还提供了更好的封装和安全性,因为它只允许外部代码订阅事件,而不允许直接调用事件。最后,事件还提供了更好的灵活性,因为它允许多个事件处理程序订阅同一个事件,从而使程序更加可扩展和可维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捕不到月亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值