深入理解C#中常见的委托
委托的定义
委托(Delegate)是一种类型,它可以封装一个方法,使该方法像一个对象实例一样被传递。委托可以像其他任何对象一样进行实例化和调用,其实质是把方法作为参数进行传递和执行。在C#当中,定义委托类型需要使用delegate关键字:
delegate void MyDelegate(int param);
以上代码定义了一个名为MyDelegate的委托,该委托可以封装一个返回值类型为void,有一个int类型的参数的方法。
使用委托
- 实例化委托
我们可以像实例化对象一样实例化一个委托,并把一个方法作为参数传递给委托进行封装。
class Program
{
delegate void MyDelegate(int param);
static void Main(string[] args)
{
MyDelegate myDelegate = new MyDelegate(Method1);
myDelegate(100); //调用委托实例化的方法
}
static void Method1(int param)
{
Console.WriteLine("这是方法Method1,传入的参数为{0}", param);
}
}
此时,程序将会输出:
这是方法Method1,传入的参数为100
- 多播委托
多播委托是指一个委托可以封装多个方法,这样当调用该委托时,所有封装的方法都会被依次执行。在C#中,多播委托使用+运算符来进行多个方法的封装。同时,-运算符来解除单个方法的封装或者解除完全封装。
class Program
{
delegate void MyDelegate(int param);
static void Main(string[] args)
{
MyDelegate myDelegate1 = new MyDelegate(Method1);
MyDelegate myDelegate2 = new MyDelegate(Method2);
MyDelegate myDelegate = myDelegate1 + myDelegate2;
myDelegate(100); //调用委托实例化的方法
Console.WriteLine("-----------------");
myDelegate = myDelegate - myDelegate2;
myDelegate(200); //调用委托实例化的方法
Console.WriteLine("-----------------");
myDelegate -= myDelegate1;
myDelegate(300); //调用委托实例化的方法
}
static void Method1(int param)
{
Console.WriteLine("这是方法Method1,传入的参数为{0}", param);
}
static void Method2(int param)
{
Console.WriteLine("这是方法Method2,传入的参数为{0}", param);
}
}
在以上示例中,我们定义了两个方法Method1和Method2,然后我们通过实例化委托的方式将这两个方法封装到了实例化的委托中。接着,我们使用+运算符进行多个方法的封装,并使用-运算符进行单个方法的解除封装。最终,我们使用-=运算符解除所有封装,此时多播委托将会被设置为null,因此,调用其方法时将不会有任何输出。
在以上示例中,程序的输出为:
这是方法Method1,传入的参数为100
这是方法Method2,传入的参数为100
-----------------
这是方法Method1,传入的参数为200
-----------------
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解C#中常见的委托 - Python技术站