2010-04-29 77 views
12

我閱讀了一篇關於using C# 3 features in C# 2的文章,您可以在其中輸入例如var x = 2;的類型,即使該項目是2.0項目,Visual Studio 2008編譯器也會選取它並生成與輸入int x = 2時相同的代碼。在C#2.0中使用關鍵字var bad?

但我沒有得到的是,你應該不是在某些情況下做到這一點?我一直認爲var關鍵字在C#3之前並沒有到達。如果編譯器生成相同的代碼,並且我可以鍵入C#3代碼和C#2代碼完全相同,那麼真的有什麼區別,因爲CLI是相同的, 對?從鏈路

引用上述

在幕後,編譯器產生常規的.NET 2.0代碼。

.NET 2.0代碼和.NET 3代碼是否有區別?

+3

混淆了C#和.Net Framework版本。 「在C#2中使用C#3功能」 - 是錯誤的陳述。應該是「使用.Net 2.0中的C#3功能」。 – 2010-04-29 10:18:04

回答

25

恐怕你在混合使用C#版本和.NET版本。

你不能在C#2.0中使用var,編譯器會認爲它只是一個標識符。但是,您可以在C#3.0中將它用於.NET 2.0,因爲var只是一種語言(C#)構造,而不是.NET構造。 .NET編譯器會將它轉換爲生成的CIL中的適當類型,因此JIT編譯器將永遠不會看到它,並且您將完全正常。

因爲VS2008編譯器是一個C#3.0編譯器,所以在使用var時不會遇到任何問題,無論您的目標.NET版本如何。

+0

啊哈!這是我正在尋找的答案。這可能是另一個問題,但在這種情況下,.NET 2和.NET 3之間的結果代碼之間是否存在差異,即編譯器執行它之後產生的結果? – Patrick 2010-04-29 10:37:30

+0

CIL與您在作業中編寫右側表達式返回的類型完全相同;您要定位哪個.NET版本並不重要。 – Gorpik 2010-04-29 10:41:48

+0

因此,.NET 2和.NET 3的區別在於.NET 3包含一些額外的類(如LINQ),並且語法實際上是相同的(如果您使用像VS2008這樣的C#3編譯器)? – Patrick 2010-04-29 10:44:07

7

var是VS2008使用的C#3語言中的合成糖。該代碼仍然可以編譯爲.net 2.0兼容。你應該擁有的唯一問題是如果你需要在VS2005中編輯這些文件。

+2

當然它是C#3的一部分。它不是.NET 3.5的一部分,但這是另一回事。 – Gorpik 2010-04-29 10:20:00

+0

謝謝Gorpik,編輯答案 – 2010-04-29 10:23:28

+0

啊,我明白了。這就說得通了。所以我仍然可以使用我的VS 2008瞄準.NET 2,並讓VS 2005用戶使用我的dll。那實際上非常漂亮 – Patrick 2010-04-29 10:26:51

1

about var:它是純粹的語法糖和編譯器技巧。鍵入var你要求編譯器根據表達式的右邊來猜測類型。這可以很容易地編譯爲.net 2.0。 Linq可能無法工作,因爲它使用.net 3.5的程序集

+2

LINQ將在編譯器將查詢表達式轉換爲對Where,SelectMany等的調用的意義上工作。如果它找不到任何這樣的方法(這通常會發生,因爲System.Linq.Enumerable會在.NET 2.0中不存在),但是如果你提供你自己的Where,SelectMany等方法,它應該綁定到它們並工作。 – Joren 2010-04-29 10:26:29

-2

var被引入來保存C#3.0中匿名類型的實例。

在.net2.0中可能是VS2008或C#編譯器必須用在設計時已知的實際類型替換它,並且如果在編碼時已知道該類型,爲什麼要使用var! :)

+2

'var'不暗示一個匿名類型,它只啓用它。例如。 'var x = 1;',x是int,不是匿名類型。 – 2010-04-29 10:23:10

+0

同意 - var可以表示任何類型。你不會將它用於編碼時已知的類型,你寧願將它用於匿名類型! – 2010-04-29 10:26:52

+0

和我所得到的是否定的投票? – 2010-04-29 10:29:25

4

關於它的用法。

關於執行它並不差,正如前面提到的,它只是語法糖,並在編譯時被替換。

編碼時,我認爲它的使用是混合的。例如:

我覺得這個沒問題。人們很容易看到什麼值

var a = "test"; 

不太好,很多人都在IDE中滾動到真正理解的代碼,這是一種痛苦。

var b = SomeReallyLongNameSpace.SubNamespace.Namespace.Class.Enum.Value1; 

這是好的,你知道結果是什麼,因爲一個明確的方法。

var c = GetString(); 

你根本不知道什麼是返回一看,這不是有益的,將得到更好的定義,而不是使用var關鍵字。

var d = GetSomething(); 
+0

我同意。這都是關於可讀性的。如果你指定給var的類型很明顯,那麼使用'var'。如果不明顯,請使用該類型的名稱。當然,當談到匿名類型時,你別無選擇,只能使用'var'。 – alimbada 2010-04-29 10:29:14

+0

是的,很好。這不是我問的。關於var關鍵字有很多問題。我想知道爲什麼我能夠在我的Visual Studio 2008 IDE中輸入它,即使我的項目是針對.NET 2的。謝​​謝你的回答,儘管 – Patrick 2010-04-29 10:30:49

+1

@Patrick,我只剔除了這個問題......標題是「正在使用關鍵字var在C#2.0中不好?「幷包含在其中,你問:「但是我得不到的是,如果你在某些情況下不這樣做?」。我試圖強調一些不應該考慮構建過程的情況。 – Ian 2010-04-29 11:13:28