日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#面试:委托

發布時間:2024/1/17 C# 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#面试:委托 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

面試常見題:

1.委托是什么?★☆

2.為什么需要委托?★☆

3.委托能用來做什么?★☆

4.如何自定義委托★☆

5..NET默認的委托類型有哪幾種?★☆

6.怎樣使用委托?★★★

7.多播委托是什么?★★★

8什么是泛型委托?★★★

9.什么是匿名方法?★★

10.委托是否可以回調實例方法★★★

11.Lambda表達式是什么?

12.Lambda表達式怎么傳參?★★★

13.Lambda多行代碼怎么寫?★★

14.什么是閉包?★★

事件的面試題我放在下一篇里面。

看完這些題目,心中是否有疑惑呢?那就接著看唄,我來幫您解答心中的疑惑o(^▽^)o

回到頂部

參考答案:

1.委托是什么?★☆

本題主要考察委托的概念:委托是尋址的.NET版本。在C++中,函數指針只不過是一個指向內存位置的指針,它不是類型安全的。我們無法判斷這個指針實際指向什么,像參數和返回類型等項久更無從知曉了。而.NET委托完全不同,委托是類型安全的類,它定義了返回類型和參數的類型。委托類不僅包含對方法的引用,也可以包含對多個方法的引用。

2.為什么需要委托?★☆

本題主要考察直接調用一個方法和通過委托來間接調用委托的區別。

在很多場景下直接調用方法是比較簡單方便的,但是在某些場景下,使用委托來調用方法能達到減少代碼量,實現某種功能的用途,比如說事件。

3.委托能用來做什么?★☆

本題主要考察委托在我們寫code時的用途。一個籠統的準則:當要把方法傳給其他方法時,需要使用委托。比如下面幾個場景:

  a.啟動線程和任務

    調用System.Threading.Thread的一個實例上使用方法Start(),必須為計算機提供開始啟動的方法的襲擊,

    即Thread類的構造函數必須帶有一個參數,該參數定義線程調用的方法。

    Thread t =?new?Thread(new ThreadStart(Go));//public static GO(){}

    有興趣的同學可以看下我之前寫的多線程的博客:干貨分享:詳解線程的開始和創建

  b.設計模式中的簡單工廠模式。

    向一個方法中傳遞一個子類的方法。

  c.事件。

    一般通知代碼發生了什么事件。GUI編程主要處理事件。在引發事件時,運行庫需要知道應執行哪個方法。

    這就需要處理事件的方法作為一個參數傳遞給委托。

4.如何自定義委托★☆

聲明一個委托類型,它的實例引用一個方法,該方法獲取一個int參數,返回void

public delegate void Feedback(int num);

理解委托的一個要點是它們的安全性非常高。在定義委托時,必須給出它所表示的方法的簽名和返回類型等全部細節。

理解委托的一種比較好的方式是把委托當作這樣一件事情:它給方法的簽名和返回類型指定名稱。

其語法類似于方法的定義,需要在定義方法的前面加上delegate關鍵字。定義委托基本上就是定義一個新的類,

所以可以在任何地方定義類的相同地方定義委托,也就是說,可以在另一個類的內部定義,也可以在任何類的外部定義,

還可以在名稱控件中把委托定義為定義為頂層對象。訪問修飾符可以是public/private/protected

5..NET默認的委托類型有哪幾種?★★

1.Action<T>

  泛型Action<T>委托表示引用一個void返回類型的方法。這個委托類存在16種重載方法。

  例如Action<in T1,In T2>調用沒有參數的方法

2.Func<T>

  Func<T>調用帶返回類型的方法。有16種重載方法。

  例如Func<out TResult>委托類型可以調用帶返回類型且無參數的方法,

  Func<in T,out TResult>委托類型調用帶有4個參數和一個返回類型的方法。

3.等等

6.怎樣使用委托★★

下面我將會用個例子來講述怎樣使用委托

1 // 聲明一個委托類型,它的實例引用一個方法,該方法獲取一個int參數,返回string2 public delegate String myMethodDelegate(int myInt);3 // 定義一些方法給委托變量引用4 public class mySampleClass5 {6 // 定義一個實例方法7 public String myStringMethod(int myInt)8 {9 if (myInt > 0) 10 return ("positive"); 11 if (myInt < 0) 12 return ("negative"); 13 return ("zero"); 14 } 15 // 定義一個靜態方法 16 public static String mySignMethod(int myInt) 17 { 18 if (myInt > 0) 19 return ("+"); 20 if (myInt < 0) 21 return ("-"); 22 return (""); 23 } 24 } 25 public static void Main() 26 { 27 // 給每個方法都創建一個委托實例 28 // 對于實例方法,mySC必須提供 29 // 對于靜態方法,只需要指定類的名字 30 mySampleClass mySC = new mySampleClass(); 31 myMethodDelegate myD1 = new myMethodDelegate(mySC.myStringMethod); 32 myMethodDelegate myD2 = new myMethodDelegate(mySampleClass.mySignMethod); 33 // 調用委托 34 Console.WriteLine("{0} is {1}; use the sign \"{2}\".", 5, myD1(5), myD2(5)); 35 Console.WriteLine("{0} is {1}; use the sign \"{2}\".", -3, myD1(-3), myD2(-3)); 36 Console.WriteLine("{0} is {1}; use the sign \"{2}\".", 0, myD1(0), myD2(0)); 37 }

輸出

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".

7.多播委托是什么?★★★

??????包含多個方法的委托叫做多播委托。如果調用多播委托,就可以順序連續調用多個方法。

  為此,委托的簽名就必須返回void;否則,就只能得到委托調用的最后一個方法的結果。

例子:

1 /// <summary>2 /// 定義委托類型3 /// </summary>4 /// <param name="num"></param>5 /// <returns>void</returns>6 public delegate void Feedback(int num);7 ?8 /// <summary>9 /// 實例方法 10 /// </summary> 11 /// <param name="b"></param> 12 /// <returns>void</returns> 13 public void InstanceMethod(int a) 14 { 15 Console.WriteLine(a.ToString()); 16 } 17 /// <summary> 18 /// 靜態方法 19 /// </summary> 20 /// <param name="a"></param> 21 /// <returns>返回void</returns> 22 public static void StaticMethod( int b) 23 { 24 Console.WriteLine((b * b).ToString()); 25 } 26 ? 27 //定義一個Program實例 28 Program p = new Program(); 29 //委托feedback1指定回調方法:p.InstanceMethod 30 Feedback feedback1 = new Feedback(p.InstanceMethod); 31 //委托feedback2指定回調方法:StaticMethod 32 Feedback feedback2 = new Feedback(StaticMethod); 33 //輸出2 34 feedback1(2); 35 //輸出4 36 feedback2(2); 37 ? 38 //----多播委托------- 39 Feedback fbChain = null; 40 //將feedback1添加到fbChain委托中 41 fbChain += feedback1; 42 //將feedback2添加到fbChain委托中 43 fbChain += feedback2; 44 //輸出: 45 //2 46 //4 47 fbChain(2);

8.什么是泛型委托?★★★

?????比如第5題提到的,Action<T>就是泛型委托。

注意事項:

  1.建議盡量使用這些委托類型,而不是在代碼中定義更多的委托類型。這樣可以減少系統中的類型數目,同時簡化編碼

  2.如果需要使用refout關鍵字,以傳引用的方式傳遞一個參數,就可能不得不定義自己的委托:

    delegate void Test(ref int i)

?

  3.如果委托要通過C#params關鍵字獲取可變數量的額參數,要為委托的任何桉樹指定默認值,

    或者要對委托的泛型類型參數進行約束,也必須定義自己的委托類型

    delegate void EventHandler<TEventArgs>(Object sender, TEventArgs e)where TEventArgs : EventArgs;

?

  4.使用獲取泛型實參和返回值的委托時,可利用逆變與協變。逆變:父類轉換為子類;協變:子類轉換為父類

9.什么事匿名方法★★

匿名方法是用作委托的參數的一段代碼。

1 //匿名方法,例12 Func<int, int> anon = delegate(int i)3 {4 i = i+1;5 return i;6 };7 //輸出28 Console.WriteLine(anon(1));9 ? 10 //匿名方法,例2 11 Action<int> anon2 = delegate(int i) 12 { 13 i = i + 1; 14 }; 15 //輸出2 16 Console.WriteLine(anon(1));

10.委托是否可以回調實例方法★★★

可以。委托可以回調實例方法和靜態方法。如果是實例方法,委托需要知道方法操作的是哪個對象實例。

11.Lambda表達式是什么?

C#3.0開始,就可以使用一種新語法把實現代碼賦予委托:Lambda表達式。

只要有委托參數類型的地方,就可以使用Lambda表達式。

12.Lambda表達式怎么傳參?★★★

Lambda表達式有幾種定義參數的方式。

1.只有一個參數,只寫出參數名就足夠了。

如下面的例子:

定義了一個泛型委托,輸入參數是一個string類型,返回一個string類型,

lambda表達式:s=>s.Replace('a,b')

委托引用的方法名:oneParam

傳入參數:abc

打印結果:bbc

1 Func<string, string> oneParam = s => s.Replace('a', 'b'); 2 Console.WriteLine(oneParam("abc")); 3 Console.ReadKey();

2.如果委托使用多個參數,就把參數名放在小括號中。

如下面的例子:

定義了一個泛型委托,輸入參數是兩個int類型(可以給小括號中的變量名添加參數類型),返回一個int類型,

lambda表達式:(i, j) => i*j

委托引用的方法名:twoParam

傳入參數:24

打印結果:8

1 Func<int, int, int> twoParam = (i, j) => i*j; 2 Console.WriteLine(twoParam(2,4));

13.Lambda多行代碼怎么寫?★★

添加大括號,如果需要返回值,則必須添加return語句

1 Func<int, int, int> test = (i, j) => 2 { 3 i = i + 1; 4 i = i * j; 5 return i; 6 }; 7 Console.WriteLine(test(2, 4));

打印結果:12

14.什么是閉包?★★

通過Lambda表達式可以訪問Lambda表達式塊外部的變量,這成為閉包。

當引用外部變量時,需要注意,外部變量變化時,lambda表達式的結果也可能會隨著外部變量變化而變化。

如下面的例子:

1 int y = 5; 2 Func<int, int> lambda = x => x + y; 3 Console.WriteLine(lambda(1)); 4 y = 10; 5 Console.WriteLine(lambda(1));

第一次打印出6,第二次打印出11

轉載于:https://www.cnblogs.com/BrokenIce/p/6405706.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的C#面试:委托的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。