C#锐利体验2读书笔记

匿名方法,迭代,匿名方法允许我们以一种“内联”的方法来编写方法代码;匿名方法是直接与委托实例化相关联的,使委托实例化更加直观方便。匿名方法的几个相关问题--参数列表,--返回值,--外部变量。

addButton.Click+=delegate(object sender,EventArgs e){

  MessageBox.show(((Button)sender).Text);

}

匿名方法可以在delegate关键字后跟一个参数列表(可以不指定),后边的代码块则可以访问这些参数。如上述代码:如果后边要声明参数,则必须与声明click这个事件所的委托类型的参数列表必须一致。如果不一样就会报错。

注意:不指定参数列表和参数列表为空的区别,

正确:addButton.Click+=delegate{

  MessageBox.show(((Button)sender).Text);

}

错误:

addButton.Click+=delegate(){

  MessageBox.show(((Button)sender).Text);

}

1,匿名的方法的返回值:如果委托类型的返回值为void,匿名方法里边不能返回任何值;2:如果委托类型的返回值不为Void,匿名方法的返回值必须和委托类型的返回值兼容:delegate void MyDelegate (); //声明委托类型(没有参数,没有返回值。) MyDelegate mydele=delegate{}; //匿名参数实例化委托,MyDelegate 为类型,mydele为变量。delegate(),匿名方法实例化委托。匿名放方法就是把方法的签名去掉。

匿名方法的机制1:静态方法中的匿名方法,2:实例方法中的匿名方法,3:匿名方法中的外部变量。

public class aa{

public delegate void D();

public static void F(){

D d=delegate{

console.writeLine('ok')

}

}

}

上面灰色的代码编译器转换为

public static void F(){

D d=new D(__Method_1)

}

public static void  __Method_1(){

console.writeLine('ok');

}

2实例方法

public class aa{

public int x;

public delegate void D();

public  void F(){

D d=delegate{

console.writeLine(this.x)

}

}

}

编译

public  void F(){

D d=new D(__Method_1)

}

public  void  __Method_1(){

console.writeLine(this.x);

}

 3匿名方法的外部变量

void F(){

int x=123;

D d=delegate{Console.writeLine(x);}

}

上面的代码被编译成

class __Temp

{

  public int y;

  public void __Method1(){

  consoloe.writeLine(y)

}

}

void F(){

__Temp t =new __Temp();

t.y=123;

D d=new D(t.__Method1);

}

有时候不是我们失去了目标,而是失去了方向。
原文地址:https://www.cnblogs.com/871735097-/p/3817433.html