小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#之?dāng)U展方法學(xué)習(xí)

 kittywei 2012-02-17
  1. 擴(kuò)展方法基礎(chǔ):

當(dāng)方法的第一個(gè)形參包含 this 修飾符時(shí),稱該方法為擴(kuò)展方法 (extension method)。只能在非泛型、非嵌套靜態(tài)類中聲明擴(kuò)展方法。擴(kuò)展方法的第一個(gè)形參不能帶有除 this 之外的其他修飾符,而且形參類型不能是指針類型。

下面是一個(gè)聲明兩個(gè)擴(kuò)展方法的靜態(tài)類的示例


 1public static class Extensions
 2{
 3        public static int ToInt32(this string s) {
 4            return Int32.Parse(s);
 5        }

 6        public static T[] Slice<T>(this T[] source, int index, int count) {
 7            if (index < 0 || count < 0 || source.Length – index < count)
 8                throw new ArgumentException();
 9            T[] result = new T[count];
10            Array.Copy(source, index, result, 0, count);
11            return result;
12        }

13}

14

擴(kuò)展方法是常規(guī)靜態(tài)方法。另外,如果它的包容靜態(tài)類在范圍之內(nèi),則可以使用實(shí)例方法調(diào)用語(yǔ)法來(lái)調(diào)用擴(kuò)展方法,同時(shí)將接收器表達(dá)式用作第一個(gè)實(shí)參。
下面的程序使用上面聲明的擴(kuò)展方法


 1static class Program
 2{
 3        static void Main() {
 4            string[] strings = "1""22""333""4444" };
 5            foreach (string s in strings.Slice(12)) {
 6                Console.WriteLine(s.ToInt32());
 7            }

 8        }

 9}

10

Slice 方法在 string[] 上可用,ToInt32 方法在字符串上可用原因是它們都已聲明為擴(kuò)展方法。該程序的含義與下面使用普通靜態(tài)方法調(diào)用的程序相同:


 1static class Program
 2{
 3        static void Main() {
 4            string[] strings = "1""22""333""4444" };
 5            foreach (string s in Extensions.Slice(strings, 12)) {
 6                Console.WriteLine(Extensions.ToInt32(s));
 7            }

 8        }

 9}

10


2. 擴(kuò)展方法調(diào)用:
如果在正常的方法調(diào)用處理找不到適用的方法,則將嘗試以擴(kuò)展方法調(diào)用的形式處理該構(gòu)造。目標(biāo)是查找最佳的類型C,以便可以進(jìn)行相應(yīng)的靜態(tài)方法調(diào)用:
如果滿足以下各項(xiàng),則擴(kuò)展方法 C.M 符合條件:

·         C 為非泛型、非嵌套類

·         M 的名稱為和用戶調(diào)用方法名稱相同

·         M 作為靜態(tài)方法應(yīng)用于參數(shù)時(shí)是可訪問(wèn)且適用的

存在從表倒是到方法M 的第一個(gè)參數(shù)的類型的隱式標(biāo)識(shí)、引用或裝箱轉(zhuǎn)換。
對(duì)類型C的搜索操作如下:

·         從最接近的封閉命名空間聲明開始,接下來(lái)是每個(gè)封閉命名空間聲明,最后是包含編譯單元,搜索將連續(xù)進(jìn)行以找到候選的擴(kuò)展方法集:

o        如果定的命名空編譯單元直接包含具有適當(dāng)擴(kuò)展方法M的非泛型C,則這擴(kuò)展方法的集合集。

   o        如果使用定命名空編譯單元中的命名空指令導(dǎo)入的命名空直接包含具有適當(dāng)擴(kuò)展方法M的非泛型C,則這擴(kuò)展方法的集合集。

·         如果在任何封閉命名空間聲明或編譯單元中都找不到候選集,則會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。

·         否則,將對(duì)候選集應(yīng)用重載決策。如果找不到一個(gè)最佳方法,則會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。

·         C是將最佳方法聲明為擴(kuò)展方法的類型。

·       如果將C用作目標(biāo),則將以靜態(tài)方法調(diào)用的形式處理該方法調(diào)用。

上述規(guī)則表示,實(shí)例方法優(yōu)先于擴(kuò)展方法,內(nèi)部命名空間聲明中可用的擴(kuò)展方法優(yōu)先于外部命名空間聲明中可用的擴(kuò)展方法,并且直接在命名空間中聲明的擴(kuò)展方法優(yōu)先于通過(guò) using 命名空間指令導(dǎo)入該命名空間的擴(kuò)展方法。例如:


 1public static class E
 2{
 3        public static void F(this object obj, int i) { }
 4        public static void F(this object obj, string s) { }
 5}

 6class A { }
 7class B
 8{
 9        public void F(int i) { }
10}

11class C
12{
13        public void F(object obj) { }
14}

15class X
16{
17        static void Test(A a, B b, C c) {
18            a.F(1);                // E.F(object, int)
19            a.F("hello");        // E.F(object, string)
20            b.F(1);                // B.F(int)
21            b.F("hello");        // E.F(object, string)
22            c.F(1);                // C.F(object)
23            c.F("hello");        // C.F(object)
24        }

25}

26

在該示例中,B 的方法優(yōu)先于第一個(gè)擴(kuò)展方法,而 C 的方法優(yōu)先于這兩個(gè)擴(kuò)展方法。
下面是另一個(gè)示例:


 1public static class C
 2{
 3        public static void F(this int i) { Console.WriteLine("C.F({0})", i); }
 4        public static void G(this int i) { Console.WriteLine("C.G({0})", i); }
 5        public static void H(this int i) { Console.WriteLine("C.H({0})", i); }
 6}

 7namespace N1
 8{
 9        public static class D
10        {
11            public static void F(this int i) { Console.WriteLine("D.F({0})", i); }
12            public static void G(this int i) { Console.WriteLine("D.G({0})", i); }
13        }

14}

15namespace N2
16{
17        using N1;
18        public static class E
19        {
20            public static void F(this int i) { Console.WriteLine("E.F({0})", i); }
21        }

22        class Test
23        {
24            static void Main(string[] args)
25            {
26                1.F();
27                2.G();
28                3.H();
29            }

30        }

31}

32

該示例的輸出為:

E.F(1)
D.G(2)
C.H(3)

D.G 優(yōu)先于 C.G,而 E.F 優(yōu)先于 D.F C.F

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多