C#基础委托

版权声明:转载 请说明 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

 

事件

猜你喜欢

转载自blog.csdn.net/qq2512667/article/details/82881222