2013-04-25 80 views
0

我對C#中的使用var關鍵字感到非常困惑。
我知道,var使代碼更容易閱讀,但速度和內存呢?C#var關鍵字的使用

A.

  1. var a = 100;
  2. int b = 100;
  3. int c; c = 100;

B.

  1. var listA = new List<obj>();
  2. List<obj>listB = new List<obj>();
  3. List<obj>listC; listC = new List<obj>();

哪個更快?
這種類型有依賴性嗎?
在這兩種情況下以及分配內存時分配了多少內存?

+2

我認爲var使代碼更難閱讀,與php一樣,你並不總是知道var是什麼類型,尤其是如果它嵌套很深或者隱藏在API中。 – 2013-04-25 14:59:20

+1

_哪個更快?_ http://ericlippert.com/2012/12/17/performance-rant/ – 2013-04-25 14:59:51

+0

@ Shane.C我會重寫一下「var有可能讓代碼更容易閱讀*有時*」。 – Andrey 2013-04-25 15:00:22

回答

4

哪個更快?

兩者都不相同。

這種類型有依賴性嗎?

我不確定你在這裏問什麼,但是這些代碼片段在編譯後沒有區別,所以我會不去做。

在兩種情況下和分配內存時分配了多少內存?

這對所有人都是一樣的。對於int示例,所有情況下均爲32位。對於List示例,全部三個將爲引用分配一個字,併爲實際列表實例分配內存。

2

它純粹是編譯步驟功能。編譯器推斷左側表達式的類型,並將其用作變量類型。因此產生的IL將是相同的。

所以:

var list1 = new List<int>(); 
List<int> list2 = new List<int>(); 

完全一致。但我可以看到一些例子,其中指定類型可以有一些效果,如:

var i1 = 5; 
int i2 = 5; 
//vs: 
var i2 = 5; 
object i2 = 5; 

因此,如果實際的表達式類型是完全一樣的聲明的變量類型一樣,那麼它們完全一致。但如果表達式類型和變量類型不相同,則var可能會有所不同。

+0

+1解釋了爲什麼在第一種情況下沒有區別,而不是僅僅說它們是相同的。 – 2013-04-25 15:04:55

0

只有當C#編譯器生成程序集的IL代碼時,Var關鍵字才起作用,要創建的變量類型由表達式的右側計算(必須指定並且不能爲空)。 Var在運行時不會影響任何東西。

0

var從無論是從右邊的語句返回推斷。這是由編譯器完成的,所以當程序實際運行時,沒有區別。

但是,請注意,如果語句生成意外類型,則不會收到編譯器錯誤。

+1

意外類型推斷在其他合理代碼中導致問題的最常見方式是通過阻止試圖用比指定的類型更少的類型重寫變量的下游代碼進行編譯。否則,除了一個例外,使用類型推斷的合理編寫的代碼將在編譯時工作或失敗。最大的「問題」可能是使用返回值類型的GetEnumerable方法。 'var en = MyList.GetEnumerator()'可能與'IEnumerable​​en = MyList.GetEnumerator()'行爲不同,即使兩者都編譯。 – supercat 2013-04-25 15:53:28

1

何時使用var以及哪裏不用。 (因爲所有其他問題已經在這裏回答) 爲什麼var ?? - 匿名類型和LINQ

匿名(臨時使用)類型:

var v = new { Amount = 108, Message = "Hello" }; 

一般:

用途:

var myList = new List<string>(); 

這是顯而易見的myList有什麼類型 - 讀碼是不錯

不要用:

var properties = myPropertyHandler.GetProperties(); 

在這裏你不知道GetProperties返回的是什麼類型 - 代碼讀取不好。聲明:

AppProperties properties = myPropertyHandler.GetProperties();