C#基礎委託
阿新 • • 發佈:2018-10-31
什麼是委託?
相比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
事件