2007年12月28日 星期五

C# 3.0 - Implicitly Typed Local Variables (隱含類型區域變數)

在C# 3.0中提供一些新的語言特性;其中一種就是隱含類型區域變數。其用法是使用關鍵字var 進行區域變數的宣告,如下所示
  var age = 26;
  var username = "zhuye";
使用var關鍵字,是讓編譯器自行判斷其變數之型態;所以在CLR執行時,此變數已被編譯器指定了變數型態。以下的例子之執行結果就可以了解。
  var myInt = 0;
  var myBool = true;
  var myString = "Time, marches on...";
  var evenNumbers = new int[] { 2, 4, 6, 8 };
  var myMinivans = new List();
  var myEmployee = new Employee();

  Console.WriteLine("myInt is a:{0}", myInt.GetType().Name);
  Console.WriteLine("myBool is a:{0}", myBool.GetType().Name);
  Console.WriteLine("myString is a:{0}", myString.GetType().Name);
  Console.WriteLine("evenNumbers is a:{0}", evenNumbers.GetType().Name);
  Console.WriteLine("myMinivans is a:{0}", myMinivans.GetType().Name);
  Console.WriteLine("myEmployee is a:{0}", myEmployee.GetType().Name);


var關鍵字能夠用在以下狀況:
  1. 區域變數。隱含類型可以使用在任何的基本類型型態。包含arrays、generics、及自訂的類別型態 。
  2. for 迴圈陳述式。ex: for(var x = 1; x <>
  3. foreach 迴圈陳述式。ex: foreach(var item in list){...}
  4. using 陳述式。ex: using (var file = new StreamReader("C:\\myfile.txt")) {...}

var關鍵字使用上的限制:

  1. var關鍵字不可以使用在類別的欄位及方法之回傳值或參數上。所以以下程式碼的宣告在編譯期間就會發生錯誤:
    // 編譯錯誤!var關鍵字不能被使用在宣告類別資料
    private var myInt = 10;

    // 編譯錯誤!var關鍵字不能被使用在方法之回傳值或是方法的參數
    public var MyMethod(var x, var y){}
  2. 宣告隱含類型變數時,必須同時指定變數值,且不可以指定初始值為null;但是可以在指定初始值後將物件值設定為null。
    // 編譯錯誤!利用var關鍵字宣告之變數必須指定變數值
    var myData;

    // 編譯錯誤!利用var關鍵字宣告之變數必須於宣告時同時指定變數值
    var myInt;
    myInt = 0;

    // 編譯錯誤!利用var關鍵字宣告之變數不可指定為null
    var myObj = null;

    // OK!
    var myCar = new SportsCar();
    myCar = null;

隱含類型變數也可以宣告成陣列型態。但是要注意的部份是變數陣列在宣告時,陣列值必須同時被初始化,且陣列內成員的型態中不可以混合。

  var a = new[] { 1, 2, 3, 4000 };  // 變數a 被視為一個整數型別陣列(int[])
  
   var b = new[] { 1, 1.5, 2, 2.5 };  // 變數b 被視為一個雙精準度型別陣列(double[])

  var c = new[] { "we", null, "are", null, "family" };  // 變數c 被視為一個字串型別陣列(string[])

  var myCars = new[] { new SportsCar(), new SportsCar()}; // 變數myCars 被視為一個SportsCar型別陣列

  var d = new[] { 1, "one", 2, "two" }; // 編譯錯誤!利用var關鍵字宣告的陣列成員,其值不可以有混合型態




沒有留言: