2010-07-10 61 views

回答

16

var只是「讓編譯器爲我選擇正確的變量類型」(編譯時類型推斷更準確的術語)的簡寫。

object另一方面是特定類型;所有其他參考類型都從object派生,因此您可以將任何內容分配給類型爲object的變量。

+3

除非它是一個原始的,在這種情況下,它必須在分配到'對象'參考。 – 2010-07-10 23:15:58

+0

我認爲應該添加到選定答案的東西是,如果您使用var,那麼就像@Ben Voigt所說的那樣,您可以對存儲在var中的對象執行操作,而不必執行此操作。 – Eric 2010-07-10 23:42:18

10

var是,當你發現自己在問,難道我真的要鍵入長的類型名稱兩次,例如: -

Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>> myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>(); 

爲什麼沒有朋友,你不知道答案。使用var代替:

var myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>(); 

現在myDict真的是Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>,這樣你就可以添加東西出來,枚舉它,等

如果你宣佈它爲object,你不能做任何操作與它由Dictionary提供,只對所有對象有效。

+2

我很想看到這些代碼在行動。 – 2010-07-10 23:50:20

+0

您的電腦運行Windows? J/K。 我編造了這種特殊的類型,但我很努力地使用可能實際組合在一起的類型。 – 2010-07-11 00:10:42

+0

@Joe,我不會... – jonnystoten 2010-07-11 00:11:11

4
var foo = "Hello, I am a string!"; 
// foo is a string, so this compiles 
var fooCharArray = foo.ToCharArray(); 

object bar = foo; 
// bar is not a string, so this does not compile 
var barCharArray = bar.ToCharArray(); 

在第一個例子中,編譯器知道foo是一個字符串,所以我們可以調用foo字符串的方法。

在第二個示例中,我們將字符串foo「上傳」到一個對象。現在編譯器不知道(因爲它不應該知道!)bar實際上是一個字符串,我們不能在bar上調用字符串方法。編譯器不允許從對象(或任何基本類型)到派生類型的隱式向下轉換(如System.String)。它是編譯時類型安全規則的一部分。

5

var仍然是強類型的,但有了對象,你將不得不施放所有東西。