委拖 lambda 匿名方法 匿名类 扩展方法

1. 委托的声明

public delegate void NoReturnNoParam();
public delegate int WithReturnNoParam();
public delegate void NoReturnWithParam(string s, int i);
public delegate int WithReturnWithParam(string s, int i);

委托的声明: delegate [返回类型]  委托类型名 (参数1, 参数2)

委托是一种类型;


2. 委托的实例化

NoReturnNoParam method1 = new NoReturnNoParam(this.DoNothing);
NoReturnNoParam method2 = new NoReturnNoParam(() => { Console.WriteLine("Do nothing"); });
NoReturnNoParam method3 = this.DoNothing;
NoReturnNoParam method4 = () => { Console.WriteLine("Do nothing"); };

委托的实例化:

   1. 通过new 构造一个委托实例,参数是:方法(名)或lambda表达式;

   2. 直接给委托的变量赋值一个方法(名)或lambada表达式;

在给委托实例化的时候,一定要注意:用来实例化委托的方法的签名(返回值类型,参数类型和顺序都必须一致)必须和委托的声明是一致;


3. 委托的调用

method1.Invoke();
method1();

委托的调用:

   1.  通过委托实例的Invoke方法调用;

   2.  将委托当成方法一样,直接在实例名后加上括号和参数直接调用;

4. 匿名方法

WithReturnNoParam method5 = new WithReturnNoParam(delegate ()
{
     return 100;
}
);
WithReturnNoParam method6 = new WithReturnNoParam(delegate ()
{
     return 100;
}
);

5. lambda表达式

将匿名方法的delete去掉,在参数列表后加上”=>”(goes to)

WithReturnNoParam method7 = new WithReturnNoParam(() => { return 100; });
WithReturnNoParam method8 = () => { return 100; };
WithReturnNoParam method9 = () => 100;  //方法体只有一行的时候,可以去掉大括号和分号,如果仅有的一行是return语句,还可以省略return关键字

NoReturnWithParam method10 = (string name, int age) => { Console.WriteLine($"name:{name}, age:{age}"); };
NoReturnWithParam method11 = (name, age) => Console.WriteLine($"name:{name}, age:{age}"); //参数类型可以省略


6. 系统自带的委托

Action :   没有返回值的委托,参数最多16个

Func: 带返回值 的委托,参数最多16个;Func的泛型的最后一个可变类型参数是返回类型

Action act1 = () => Console.WriteLine("Do nothing");
Action<string> act2 = s=>Console.WriteLine(s);  // 当只有一个参数的时候,括号可以省略       

Func<int> func1 = () => 100;
Func<string, int> func2 = (s) => s.Length;  

7. 匿名类 var

object user = new
{
     Name = "Harry",
     Age = 18,
     Height = 176.5,
     Address = "Peking City"
};
//Console.WriteLine(user.Name); // 不可以访问user的属性
var user2 = new
{
     Name = "Harry",
     Age = 18,
     Height = 176.5,
     Address = "Peking City"
};
Console.WriteLine($"Name:{user2.Name}, Age:{user2.Age}, Height:{user2.Height}, Address:{user2.Address}");

var 关键字可以接收返回任意类型的结果或表达式的结果,前提类型可由编译器推导出;

var只能声明局部变量,不能是字段,也不能是静态属性;

var声明的时候必须被初始化;

8. 扩展方法

静态类,静态方法的第一个参数前加上this关键字,这个参数所在的类型将都会扩展此方法,可像成员方法一样去调用,如:

public static class ExtendShow
{
     public static int ToInt(this int? i)
     {
         return i ?? -1;
     }

}

int? i = null;
Console.WriteLine(i.ToInt());

在不修改第三方类库封装的情况下,给类型额外的扩展一个方法;

如果跟实例方法相同,则优先调用实例方法;

posted @ 2017-06-11 22:50  matsn  阅读(170)  评论(0编辑  收藏  举报