2011年6月9日 星期四

C# 的隱含型別

在 C# 語法裡面寫

var v1=38.38 ;
var v2=74.74;
var v_sum=v1+v2;


這樣會不會很奇怪?自己剛遇到時,還一度以為是誰不小心把 javascript 放到 C# 裡了。我的老師常說:「行有不得,反求諸己」,的確,我有好一陣子沒看程式設計的書了。

在 C# 3.0 開始,引進了「隱含型別 (implicitly type )」,編譯器會依據指定給隱含型別變數的初始值自動決定變數的型別。換言之,如果不指定初始值,那隱含型別是否就無法決定正確的型別了?沒錯,使用隱含型別,一定要指定初始值。下面的寫法在編譯時,都會產生錯誤:

var v1;
var v2=null;

使用隱含型別,目前聽到的主要好處有三:


第一:可以少打幾個字。
System.Data.DataSet ds1 = new System.Data.DataSet();
var ds2 = new System.Data.DataSet();
看到了吧!這樣可以避免過度使用你的手指頭...,甚至連 namespace 都可以不用引用了。

第二:配合 LINQ 所產生的查詢結果。
// for linq test
string[] words = {"a111","a222","b111","b222","c111" };
var v_selected_words = 
    from w 
    in words 
    where w[0] == 'b' 
    select w;

foreach (string s in v_selected_words)
{
    Console.WriteLine(s);
}

Console.ReadKey();

如此一來,對習慣使用 LINQ 的人來說,的確可以讓程式整潔一致些。

第三:提供匿名型別(Anonymous Type)。
// for anonymous test
var v_anonymous= new { Name="paladin", Empno="3388"};
Console.WriteLine(v_anonymous.Name);  //show: paladin
Console.WriteLine(v_anonymous.Empno); //show: 3388

Console.ReadKey();

這裡省去了明確宣告類別或變數的動作,允許你直接使用。如果沒有匿名型別,原先的程式寫法,很可能就會如下所示,相較之下,的確省了不少程式。
namespace ConsolVar
{
    class Program
    {
        
        static void Main(string[] args)
        {

            MyClass oM = new MyClass();
            oM.Name = "paladin";
            oM.Empno = "3388";
            Console.WriteLine(oM.Name); //show: paladin
            Console.WriteLine(oM.Empno);//show: 3388           

            Console.ReadKey();
        }        
    }

    public class MyClass
    {
        private string _Name;
        private string _Empno;
        public string Name {
          get { return _Name; } 
          set { _Name = value; } }
        public string Empno { 
          get { return _Empno; } 
          set { _Empno = value; } }
    }
}

瞭解了隱含型別所帶來的好處,但還是要知道他的限制。目前的隱含型別,只能夠用在區域變數而已,而且也不能夠用在類別屬性的宣告裡。例如上面的 MyClass ,下面的寫法則是錯誤的:
public class MyClass
    {
        private string _Name;
        private string _Empno;
        public string Name {
          get { return _Name; } 
          set { _Name = value; } }
        public string Empno { 
          get { return _Empno; } 
          set { _Empno = value; } }
       
        var v = "123"; //錯誤用法
    }

參考:
01:var (C# Reference)
02:Implicitly Typed Local Variables (C# Programming Guide)
03:[C#] 使用 var 關鍵字宣告隱含型別
04:C# 3.0的var隱含型別宣告
05:Anonymous Types
06:C# 3.0 Tutorials: What is Anonymous type?
07:Beginning ASP.NET 3.5 in C# 2008 From Novice to Professional,Second Edition,Matthew MacDonald,Apress

沒有留言:

張貼留言