1. 程式人生 > >C#基礎委託

C#基礎委託

什麼是委託?

相比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

 

 

事件