2010-09-26 126 views
0

我需要在c#中「雙重聲明」每個新實例嗎?在C#中聲明實例

Obj sb = new Obj(); 

VB便宜

Dim sb as new Obj() 

和Python最低

sb=Obj() 

回答

6

好,爲C#3你可以使用var局部變量:

var x = new Dictionary<string, string>(); 

注意這個我與Python聲明非常不同:變量x仍然是Dictionary<string, string>類型;只是編譯器從作業的右側推斷了類型。所以你仍然可以獲得IntelliSense支持以及靜態類型的所有其他好處。 (如果你想動態輸入,你可以使用C#4以來的dynamic,但這是一個非常不同的功能。)

此功能部分添加以支持匿名類型,儘管它在其他情況下也非常有用;最值得注意的是當你調用一個構造函數。

有幾件事情要牢記:

  • 適用於局部變量,而不是實例或靜態變量
  • 您只能使用它,當你聲明,並在相同的分配聲明
  • 編譯器必須能夠從作業中推斷具體類型;你不能寫

    var x = null; 
    

    例如。

  • 牢記可讀性。如果不是很明顯是被分配什麼樣的類型,可以考慮使用一個明確的聲明
  • 如果以後要分配了一個不太確切的表達,你可能需要使用顯式類型
  • 隱式類型有助於強調什麼代碼是這樣做的而不是它如何它是這樣做的;對於其中「how」特別重要的代碼位,考慮仍然使用顯式聲明
+0

啊,太好了。 *請記住檢查解決方案,由於某些原因,必須等待13分鐘。* – joeriks 2010-09-26 08:40:55

+0

@joeriks:「某種原因」是在那個時候可能會有更好的答案。當然,更好的答案可能會在以後出現,但它讓所有人都有機會進入,而問題仍然比較新鮮。 – 2010-09-26 08:43:34

+0

@joeriks,你是否以任何方式測試答案的證明?我並不懷疑喬恩的答案,但立即接受任何聽起來不錯的(精心製作的)答案都不會幫助任何人;)尤其是當答案完全錯誤時。所以要小心太快(沒有冒犯性) – 2010-09-26 08:51:10

3

在C#3.0和更高版本中,您現在可以使用var聲明它們。

var obj = new Obj(); 
+0

非常感謝,我責備在移動設備上打字;) – 2010-09-26 09:28:16

0

以下示例顯示了一些類型推論沒有雙重明確的類型規範(有時不存在)發生如下:

int[] array = { 1, 2, 3, 5, 6, 7, 8 }; 


    var q = from x in array 
      let y = x.ToString() 
      select y; 

    foreach (var item in q) 
    { 

     Console.WriteLine(item.GetType()); 

    } 

1)陣列decalration的右手側單獨示出了數組初始化沒有類型說明。過去需要使用數組類型規範。
2)var q ....其中q從右側推斷。
3)從x ....這個範圍變量的類型是從數組的元素類型推斷的
4)讓y ...從右邊再次推斷範圍變量y的類型 5)foreach(var中的項目)...再次推斷的項目類型並未明確聲明

在規範中詳述的現代C#版本(例如lamba表達式)中有無數類型推斷的其他實例。所以不,你不必再指定兩次。事實上,目前很難看到這種明確的和潛在的冗餘規範的要求(例如,變量聲明)