C#3.0學習筆記(7)淺談委託

來源:互聯網
上載者:User

1,  什麼是委託?

  答:委託即具有相同簽名和傳回值類型的有序方法列表。

  注意:

  1>     方法的列表稱為調用列表(invocation list)。

  2>     當委託被調用時,方法列表中的每一個方法都將被調用。

  3>     委託是參考型別資料,因此有引用和對象。

2,  如何聲明委託?

  delegate void MyDel(int x);

  註:

  1>     delegate為關鍵字。

  2>     void表示傳回型別,如果有傳回值的話就是對應的傳回型別,如int。

  3>     MyDel表示委託名稱。

  4>     MyDel(int x)表示簽名。

3,  建立委派物件的兩種方法?

  方法1:使用帶new運算子的對象建立運算式。

      MyDel del=new MyDel(ClassA.method1);

  方法2:使用快捷文法,僅由類名和方法名構成,使用快捷文法是因為在方法名稱和其相應的委託類型之間有隱式轉換。

      MyDel del=new ClassA.method1;

4,  委託調用?

  1>     無傳回值和參數的委託調用:

namespace delegate1

{

/*調用無傳回值和參數的委託*/

delegate void PrintFunction(); //定義一個沒有傳回值和參數的委託類型。

class Program

{

static voidMain(string[] args)

{

Test t = new Test();

PrintFunction pf;//創建一個空委託對象

pf = t.Print1;//初始化委託

pf += Test.Print2;//使用+=運算符為委託增加方法。注意靜態方法的調用方法(類名.方法名)。

pf += t.Print1;

pf += Test.Print2;

if (pf != null)//判斷委託中是否含有方法

{

pf(); //調用委託

}

else

{

Console.WriteLine("委託中沒有任何方法!");

}

Console.ReadKey();

}

}

class Test

{

public void Print1()

{

Console.WriteLine("Print1---實例化方法");

}

public static void Print2()

{

Console.WriteLine("Print2---靜態方法");

}

}

}

   程式輸出結果為:

  2>    帶傳回值委託的調用:

namespace delegate2

{

/*調用帶傳回值的委託*/

/*

1,調用方法列表中最後一個方法返回的值就是委託調用返回的值。

2,調用方法列表中所有其它方法的傳回值都會被忽略。

*/

delegate int Mydel();

class Program

{

static voidMain(string[] args)

{

MyClass mc = new MyClass();

Mydel mDel = mc.Add2;

mDel += mc.Add3;

mDel += mc.Add2;

Console.WriteLine("Value:{0}",mDel());

Console.ReadKey();

}

}

class MyClass

{

int IntValue = 5;

public int Add2()

{

IntValue += 2;

return IntValue;

}

public int Add3()

{

IntValue += 3;

return IntValue;

}

}

}

          程式輸出的結果為:

 

   3>    帶引用參數的委託的調用:

namespace delegate3

{

/*調用帶引用參數的委託*/

/*

1,在調用委託列表中的下一個方法時,參數的新值(不是初始值)會傳給下一個方法。

*/

delegate void MyDel(ref int x);

class Program

{

static voidMain(string[] args)

{

MyClass mc = new MyClass();

MyDel mDel = mc.Add2;//Add2(x=5)

mDel += mc.Add3;//Add3(x=7)

mDel += mc.Add2;//Add2(x=10)

int x = 5;

mDel(ref x);

Console.WriteLine("委託mDel的值為:{0}",x);

Console.ReadKey();

}

}

class MyClass

{

public void Add2(ref int x)

{

x += 2;

}

public void Add3(ref int x)

{

x += 3;

}

}

}

         程式的輸出結果為:

   4>    匿名方法和lambda運算式:

    匿名方法定義:匿名方法是在初始化委託時內聯(inline)聲明的方法。

namespace delegate4

{

/*匿名方法和lambda表達式*/

delegate double MyDel(int par);

class Program

{

static voidMain(string[] args)

{

MyDel del = delegate(int x) { return x + 1; };//匿名方法。

MyDel le1 = (int x) => { return x + 1; };//lambda表達式。省略關鍵字delegate

MyDel le2 = (x) => { return x + 1; };//lambda運算式。省略型別參數,因為編譯器可以從委託的聲明中知道委託參數的類型。

MyDel le3 = x => { return x + 1; };//lambda運算式。省略圓括弧,因為只有一個隱式型別參數。

MyDel le4 = x => x + 1;//lambda運算式。省略語句塊。

Console.WriteLine("委託del的值為:{0}", del(12));

Console.WriteLine("委託le1的值為:{0}", le1(12));

Console.WriteLine("委託le2的值為:{0}", le2(12));

Console.WriteLine("委託le3的值為:{0}", le3(12));

Console.WriteLine("委託le4的值為:{0}", le4(12));

Console.ReadKey();

}

}

}

    程式輸出結果為:

 以上是我對委託的理解和總結,各位園友們如果覺得總結得還不錯的話請給點鼓勵,如果覺得還有不足的地方也歡迎指證,讓我們一起努力吧,加油!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.