天天看點

【譯】10個鮮為人知的C#關鍵字

在正式開始之前,我需要先聲明:這些關鍵字對于偏向底層的程式員更加耳熟能詳,對這些關鍵字不了解并不影響你作為一個合格的程式員。

這意味着這些關鍵字會讓你在編寫程式時得到更好的代碼品質和可讀性,enjoy

yield

yield關鍵字會告訴編譯器目前的函數是在一個循環内部,編譯器會相應生成一個執行它在循環體内部所表示行為的類,yield和return關鍵字一起用于為枚舉器對象提供傳回值,比如說:在foreach内部的每一次循環内,yield關鍵字用于終止目前循環:

      public classList 

  { 

       //using System.Collections; 

      public static IEnumerable Power(int number, int exponent) 

       { 

           int counter = 0; 

           int result = 1; 

           while(counter++ < exponent) 

           { 

               result = result * number; 

               yield return result; 

           } 

       } 

       static void Main() 

           // Display powers of 2 up to the exponent 8: 

          foreach (int i in Power(2, 8)) 

               Console.Write("{0} ", i); 

   } 

   /* 

   Output: 

   2 4 8 16 32 64 128 256 

   */

MSDN連結:http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx

var

自從C# 3.0開始,在函數作用局範圍内聲明的變量可以通過var關鍵字聲明成隐含類型,隐含類型是強類型,你需要自己聲明隐含類型本地變量,然後編譯器會幫你決定為某種強類型。

在2.0版本上跑的程式也可以使用var關鍵字,但是需要你的編譯器是3.0以上版本并且設定代碼輸出版本為2.0:

var i = 10; // implicitly typed

int i = 10; //explicitly typed

MSDN連結:http://msdn.microsoft.com/en-us/library/bb383973.aspx

using()

定義一個範圍,在範圍外的對象将會被回收:

using (C c = new C())

{

    c.UseLimitedResource();

}

MSDN連結:http://msdn.microsoft.com/en-us/library/yh598w02%28VS.80%29.aspx

readonly

readonly關鍵字是一個可作用在變量域上的修飾符,當一個變量域被readonly修飾後,這個變量隻可在聲明或者目前變量所屬類的構造器内指派。

MSDN連結:http://msdn.microsoft.com/en-us/library/acdd6hb7%28VS.80%29.aspx

as

as操作符很像一個類型轉換器,然和,當轉換無法發生時(譯者按:比如類型不比對),as會傳回null而不是抛出一個異常:

class Class1{ }

classClass2{ }

classClass3: Class2{ }

classIsTest

   {

        static voidTest(objecto)

        {

            Class 1a;

            Class 2b;

            if(o isClass1)

            {

                Console.WriteLine("o is Class1");

                a = (Class1)o;

                // Do something with "a."

            }

            else if (o is Class2)

                Console.WriteLine("o is Class2");

                b = (Class2)o;

                // Do something with "b."

            else

                Console.WriteLine("o is neither Class1 nor Class2.");

        }

        static void Main()

            Class1 c1 = new Class1();

            Class2 c2 = new Class2();

            Class3 c3 = new Class3();

            Test(c1);

            Test(c2);

            Test(c3);

            Test("a string");

    }

    /*

    Output:

    o is Class1

    o is Class2

    o is neither Class1 nor Class2.

    */

MSDN連結:http://msdn.microsoft.com/en-us/library/scekt9xw.aspx

default

在泛型類和泛型方法中産生的一個問題是,在預先未知以下情況時,如何将預設值配置設定給參數化類型 T:

T 是引用類型還是值類型。

如果 T 為值類型,則它是數值還是結構。

給定參數化類型 T 的一個變量 t,隻有當 T 為引用類型時,語句 t = null 才有效;隻有當 T 為數值類型而不是結構時,語句 t = 0 才能正常使用。解決方案是使用 default 關鍵字,此關鍵字對于引用類型會傳回 null,對于數值類型會傳回零。對于結構,此關鍵字将傳回初始化為零或 null 的每個結構成員,具體取決于這些結構是值類型還是引用類型:

T temp = default(T);

MSDN連結:http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

global

在  ::運算符前面使用的 global 上下文關鍵字引用全局命名空間,該命名空間是任何 C# 程式的預設命名空間,未以其他方式命名。

class TestClass : global::TestApp { }

MSDN連結:http://msdn.microsoft.com/en-us/library/cc713620.aspx

volatile

volatile 關鍵字表示字段可能被多個并發執行線程修改。聲明為volatile 的字段不受編譯器優化(假定由單個線程通路)的限制。這樣可以確定該字段在任何時間呈現的都是最新的值。

MSDN連結:http://msdn.microsoft.com/en-us/library/x13ttww7%28VS.80%29.aspx

extern alias

有時可能有必要引用具有相同完全限定類型名的程式集的兩個版本,例如當需要在同一應用程式中使用程式集的兩個或更多的版本時。通過使用外部程式集别名,來自每個程式集的命名空間可以在由别名命名的根級别命名空間内包裝,進而可在同一檔案中使用。

若要引用兩個具有相同完全限定類型名的程式集,必須在指令行上指定别名,如下所示:

/r:GridV1=grid.dll

/r:GridV2=grid20.dll

這将建立外部别名 GridV1 和 GridV2。若要從程式中使用這些别名,請使用 extern 關鍵字引用它們。例如:

extern alias GridV1;

extern alias GridV2;

每一個外部别名聲明都引入一個額外的根級别命名空間,它與全局命名空間平行,而不是在全局命名空間内。是以,來自每個程式集的類型就可以通過各自的、根源于适當的名空間别名的完全限定名來引用,而不會産生多義性。

在上面的示例中,GridV1::Grid 是來自 grid.dll 的網格控件,而 GridV2::Grid 是來自 grid20.dll 的網格控件。

MSDN連結:http://msdn.microsoft.com/en-us/library/ms173212%28VS.80%29.aspx

---------------------------------------

原文連結:http://hatim.indexdev.net/2009/12/08/10-not-so-well-known-keywords-in-c/

分類: C#

好文要頂 關注我 收藏該文    

本文轉自CareySon部落格園部落格,原文連結http://www.cnblogs.com/CareySon/archive/2009/12/15/1624728.html,如需轉載請自行聯系原作者

繼續閱讀