程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 【譯】10個鮮為人知的C#關鍵字

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

編輯:.NET實例教程

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

這意味著這些關鍵字會讓你在編寫程序時得到更好的代碼質量和可讀性,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 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved