C#委托笔记

本章内容:

什么是委托?

声明委托对象?

创建委托对象?

赋值委托?

组合委托?

为委托增加方法?

从委托移除方法?

调用委托?

委托的实例?

调用带返回值的委托?

调用带引用的委托?

匿名方法?

Lambda表达式?


什么是委托?

委托:有相同签名和返回值类型的有序方法列表

(1)      方法的列表称为调用列表

(2)      当委托被调用时,它调用列表中的每一个方法


声明委托类型

委托是类型,就好像类是类型一样,所以必须在创建变量之前声明,并且不需要在类内部声明。(以delegate关键词开头,没有方法的主体)

例如:

delegate void MyDel(int x);

delegate 关键词

void 返回类型

MyDel 委托类型名

MyDel(int x) 签名

 

返回类型和签名指定了委托接受方法的形式

例如如上声明的委托:只会接受不返回值,并且有单个int参数的方法。


创建委托对象

委托变量的声明:MyDel delVar;

委托是引用类型,因此有引用和对象,因此有两种方式:

1、  使用带new运算符的对象创建表达式

2、  使用快捷语法,由方法的说明符构成

delVar=new MyDel(myInstObj.MyM1); //myInstObj.MyM1可以是实例方法或者静态方法

或者

delVar= myInstObj.MyM1;


赋值委托

由于委托是引用类型,因此可以通过给它赋值来改变包含在委托变量中的引用

例如:

MyDel delVar;

delVar= myInstObj.MyM1;

delVar=SClass.OtherM2;


组合委托

委托可以使用额外的运算符来“组合”,并最终会创建一个新的委托

例如:如下代码创建了3个委托,第三个委托由前两个委托组合。

MyDel delA= myInstObj.MyM1;

MyDel delB=SClass.OtherM2;

MyDel delC=delA+delB;


为委托增加方法

我们可以通过使用+=运算符为委托增加方法或者另一个委托。

MyDel delVar=inst.MyM1;//创建并初始化

delVar += SC.M3; //增加方法

delVar += X.Act; //增加方法

 

当使用 += 运算符时,实际发生的是创建了一个新的委托。其调用列表时左边的委托加上右边方法的组合。

 

从委托移除方法

我们可以使用 -= 运算符从委托移除方法

delVar -= X.Act; //从委托上移除X.Act方法

与为委托添加方法一样,其实是创建了一个新的委托。


调用委托

可以像调用方法一样简单的调用委托。调用委托中的参数将会用于调用列表中的每一个方法。

例如:

delegate void MyDel(int x);

MyDel delVar=inst.MyM1;

delVar += S.m3;

delVal(55); //调用委托

delVar委托接受一个int型输入值,调用委托就会使用相同的参数值(55)去调用它的调用列表中的每一个成员。

一个方法可以在调用列表中出现多次。

委托示例

delegate void PrintDelegate();//声明委托
    class TestDelegate
    {
        int IntValue = 5;
        public void Print1()
        {
            Console.WriteLine("Print1---instance");
        }

        public static void Print2()
        {
            Console.WriteLine("Print2---static");
        }
}

class Program
{
   static void Main(string[] args)
   {
       PrintDelegate myDel = new PrintDelegate(TestDelegate.Print2);
       TestDelegate t = new TestDelegate();
       myDel += t.Print1;
       myDel();//调用委托
   }
}


调用带返回值的委托

如果委托有返回值并且在调用列表中有一个以上的方法,会发生下列情况:

1、  调用列表中最后一个方法返回的值就是委托调用返回的值

2、  调用列表中所有其他方法的返回值都会被忽略

 

delegate int PrintAdd();//声明委托
    class TestDelegate
    {
        int IntValue = 5;
        public int Add2()
        {
            IntValue += 2;
            return IntValue;
        }

        public int Add3()
        {
            IntValue += 3;
            return IntValue;
        }
    }

class Program
{
   static void Main(string[] args)
   {
       TestDelegate t = new TestDelegate();
       PrintAdd p1;
            p1 = t.Add2;
            p1 += t.Add3;
            p1 += t.Add2;
            if (null != p1)
            {
                Console.WriteLine("IntValue={0}", p1());
            }
            else
            {
                Console.WriteLine("delegate is empty");
            }
            Console.Read();
    }
}

这段代码产生输出:IntValue=12


调用带引用参数的委托

如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变;

delegate void MyDel(ref int x);
class MyClass {
   public void Add2(ref int x){ x+=2;}
   public void Add3(ref int x){ x +=3;}
  static void Main(){
   MyClass mc=new MyClass();
   MyDel mydel=mc.Add2;
   mydel += mc.Add3;
   mydel += mc.Add2;
   int x=5;
   mydel(ref x);
   Console.WriteLine(“Value:{0}”,x);
   }
}

这段代码输出 Value:12

匿名方法

如果方法只会被使用一次,可以使用匿名方法

匿名方法:是在初始化委托时内联声明的方法

 

Class program{

  Public static int Add20(int x)

{

  return x+20;

}

delegate int OtherDel(int param);

Static void Main(){

  OtherDel del=Add20;

  Console.WriteLine(del(5));

  Console.WriteLine(del(6));

   }

}

Class program{

 

delegate int OtherDel(int param);

Static void Main(){

  OtherDel del=delegate(int x){

  return x+20;

}    

  Console.WriteLine(del(5));

  Console.WriteLine(del(6));

  }

}

 

如上演示了同一个类的两个版本。

左边的版本声明并使用了一个名称为Add20的方法。

右边的版本使用了匿名方法代替,左边灰色底的代码和右边灰色底的代码是等价的。

匿名方法的语法:

delegate (parameters){ ImplementationCode}

delegate 为关键词

parameters 为参数列表,如果语句块没有任何参数,则可以省略

ImplementationCode 包含匿名方法的代码


Lambda表达式

为了简化匿名方法的语法,C#3.0引入了lambda表达式,希望使用lambda表达式来替代匿名方法。

通过如下步骤把匿名方法转换为lambda表达式;

1、  删除delegate 关键字

2、  在参数列表和匿名方法主体之间放lambda运算符=>。Lambda运算符读作“goes to”

 

例如:

MyDel del=delegate(int x){ return x+1;};  //匿名表达式

MyDel le1=       (intx)=>{ return x +1;};//Lambda表达式

MyDel le2=         (x) =>{return x+1;};

MyDel le3=           x=>{return x+1;};

MyDel le4=          x=> x+1;

 

使用lambda表达式,如果没有参数,必须使用一组空的圆括号。

 

 

 






 




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C# 委托(Delegate)是一种类型,它可以用于封装一个或多个方法,使其可以像其他对象一样传递、存储和调用。委托在事件处理、多线程等方面有着广泛的应用。 C# 委托的声明方式与方法类似,可以带有参数和返回值类型,例如: ```csharp public delegate int Calculate(int a, int b); ``` 上面的代码声明了一个名为 `Calculate` 的委托类型,它包含两个 `int` 类型的参数并返回一个 `int` 类型的值。接下来可以使用这个委托类型来封装一个或多个方法。 委托的使用步骤如下: 1. 声明委托类型 ```csharp public delegate void MyDelegate(string message); ``` 2. 定义委托变量 ```csharp MyDelegate myDelegate; ``` 3. 实例化委托变量 ```csharp myDelegate = new MyDelegate(MethodA); ``` 4. 调用委托 ```csharp myDelegate("Hello"); ``` 完整的示例代码如下: ```csharp using System; namespace DelegateDemo { public delegate void MyDelegate(string message); class Program { static void Main(string[] args) { MyDelegate myDelegate; myDelegate = new MyDelegate(MethodA); myDelegate += new MyDelegate(MethodB); myDelegate("Hello"); } static void MethodA(string message) { Console.WriteLine("MethodA: " + message); } static void MethodB(string message) { Console.WriteLine("MethodB: " + message); } } } ``` 上面的代码定义了一个名为 `MyDelegate` 的委托类型,包含一个 `string` 类型的参数并返回一个 `void` 类型的值。在 `Main` 方法中,首先将 `myDelegate` 委托变量实例化为 `MethodA` 方法,然后再将其实例化为 `MethodB` 方法。最终调用 `myDelegate` 委托变量时,将会依次调用 `MethodA` 和 `MethodB` 方法。 除了以上示例中的简单委托,还有多播委托、泛型委托、匿名委托等更加高级的委托用法,可以根据具体需求选择使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值