版权声明:转载 请说明 https://blog.csdn.net/qq2512667/article/details/82881222
什么是委托?
相比C++的指针,委托是寻址方法的,NET版本, 类型安全且面向对象的 类 它定义了返回类型和参数类型,委托类不仅包含对方法的引用,也可以包含对多个方法的引用。
可以理解为 把方法当成参数 进行传递 ,一种特殊类型的对象 , 它包含一个或者多个方法的地址
1.方法里的列表称为调用列表
2.当委托被调用时,它会调用列表中的每一个方法。委托实现为派生自基类System.MulticastDelegate的类,它又派生自System.Delegate
private delegate int Sum(int a,int b); //声明
//还可以 带 参数,参数修饰符ref out 传址 传值
//声明 一个返回值是int 参数的out int的委托
private delegate int SumX(out int a);//方法中可以 重写 但是 委托不是方法 而是一个类,我们都知道同个命名空间里 类名不可重复
使用委托
void main()
{
Sum sumMethod;
SumMehthod=sumMethod;//初始化不能带参数
SumMethod(1,20);//调用的时候再进行传递参数 。
}
//委托对象 还可以作为参数
staic void GetString(Sum a,int b )
{
}
static int SumMethod(int a,int b)
{
return a+b;
}
然后是 c#系统自带的Action<T> 和Func<T>
Action<int> myAction;//表示 声明一个 无返回值, 参数为int 的 委托。 Action没有返回值
Func<int,int,int> sum; //表示 声明 一个返回值为int ,参数是两个int的 参数 ; Func最后的一个参数就是 返回值。
Action<T>是 没有返回值的,可以带参数, 参数就是T 最多可以传递0~16种参数,Func<T> 前面的泛型参数为方法参数,最后一个是返回值, 最多传递参数也0-16种,如Func<int,string>表示返回值为string 带一个int参数 的委托
他们不支持ref out参数修饰符
泛型 排序
static void GenericsSort<T>(T[] arrays,Func<T,T,bool> compareMethod)
{
bool isSort=true;
do
{
isSort=false;
for(int i=0;i<arrays.Length-1;i++)
{
if(compareMethod(arrays[i],arrays[i-1]))
{
int temp=arrays[i];
arrays[i]=arrays[i+1];
arrays[i+1]=temp;
isSort=true;
}
}
}
While(isSort)
}
class Employee
{
public string Name{get;set;}
public int Salary{get;set;}
public Employee(string name,int Salary)
{
this.Name=name;
this.Salary=Salary;
}
public static bool Compare(Employee e1,Employee e2 )
{
if(e1.Salary>e2.Salary)
return true;
else
return false;
}
public override string ToString()
{
return Name+"Salary"+Salary;
}
}
void Main()
{
Employee[] epys=new Employee[]
{
new Employee("a",10);
new Employee("b",81);
new Employee("c",40);
new Employee("d",30);
}
GenericSort(epys,Employee.Compare);
}
使用的时候只要调用T 里的CompareMethod方法即可。
匿名方法
Func<Strint,String> getString=delegate(string a)
{
Consolo.WriteLine(a);
return a;
} ;
Consolo.WriteLine(getString("这是个匿名方法"));
匿名方法没有 函数名 Func接受一个String 参数 返回值 是String ,getString是这个委托的变量,
Lambda表达式
从C#3.0开始 就 可以用 lambda 表达式 韩国人发明的
Func<int,int,int> sun =(num1,num2) => num1+num2;
Func<int,int> GetNum =num1 => num1;
多个 参数 用()括起来,一个参数 可以省去.
如果 lambda表达式只有一条语句,方法块内就不需要花括号和return语句, 编译器会添加一条隐式return 语句;
非常的简洁
参数不用 指定 类型, num1 num2自动 为int类型了, 语句 只有 一条的时候 可以不用加{}就会直接返回 num1+num2
闭包
int someVal=5;
Func<int,int> f=x=>x+someVal;
someVal=7;
Console.WriteLine( f(3)+"S"+someVal);
它会 直接访问外部变量, 使用somreVal的新值09 运算结果是10
空值传播运算符
c#6.0中的功能
?.
int age=person?.age ?? 0