簡體   English   中英

有人發現除了LINQ之外還使用“var”嗎?

[英]Anyone found a use of “var” other than for LINQ?

只是好奇。 我大約99.999%肯定沒有...但是什么?

編輯:這些是好的答案(節省打字時間或使代碼更簡潔“可讀性”)。 我想我應該澄清“使用”的意思 - 一些沒有“var”就無法完成的構造/設計。

在可讀性方面哪個更好?

AReallyReallyLongBusinessObjectName obj = new AReallyReallyLongBusinessObjectName();

要么

var obj = new AReallyReallyLongBusinessObjectName();

我說在可讀性方面,因為使用var對你的應用程序絕對沒有影響,因為這兩個語句在編譯時生成相同的IL。

對編輯的回應:沒有什么需要你使用var(除了匿名類型) - 它只是語法糖。

我經常在foreach循環中使用它:

foreach(var item in collection)

var主要用於匿名類型(沒有它就不能創建一個)。 我也看到其他人通過類型推斷使用它來減少輸入和冗余類型信息。

我個人發現,當它用於減少輸入時,它會損害可讀性 - 請記住,您花費1%的時間編寫代碼,99%的時間閱讀它。

// the compiler may be able to infer the type
// of "foo" but I certainly cannot without 
// viewing the implementation of "doSomething".
var foo = doSomething();

編輯:要記住的主要事情(這對編碼風格的所有問題都很常見)是你需要選擇一種風格並持續使用它。 只要你喜歡並且有理由使用它,你覺得它是合理的,那么你就贏了這場戰斗:)

我用var 尤其是在類名很長的所有時間- 。

它沒有為我發布問題,因為我的方法通常以這樣的方式命名,通過只看一眼名稱,我可以推斷出類型。

如果我不能,我將使用VS 2008 intellisense來幫助我,或者我只使用Resharper var => class name converter將其轉換為顯式名稱。

我發現var一個很好用的另一種情況是在foreach循環中:

foreach(var id in idList)
{
  // do what you will here
}

匿名課怎么樣?

var mySomething = new { Name = "Hello", Age=12 };

是的,我在為具有長名稱和foreach循環的類創建對象時始終使用它

編輯:我不認為var可以在設計或任何構造中發揮主要作用......因為它只能在本地使用,即在方法或范圍內。

var的另一個主要限制是你不能將它用作方法參數返回類型 您甚至無法在課堂上將其聲明為字段。 這意味着我們可以使用var來節省打字時間或使代碼更簡潔,以便於“可讀性”和LINQ

我最喜歡的非LINQ用法與foreach一起使用。 指定類型顯式指示編譯器在必要時執行強制轉換(這可能導致運行時錯誤),而簡單地使用var是一種簡單的方法來確保我確實擁有我認為具有的項類型。

我發現它在原型設計中非常有價值,它可以讓我快速存儲函數/屬性的結果,並且還可以讓我從這些函數中調整返回類型,之后清理更少。 這是一個(wee)有點像方法的接口,它讓我更少擔心具體的返回類型和更多關於方法的意圖。

正如其他人所提到的,在初始化對象的新實例時使用它也很好; Foo foo = new Foo(); 是多余的。 var foo = new Foo(); 如果有多個聲明,那就是可讀的,甚至更好......

var connString = BuildConnectionString();
var sqlConn = new SqlConnection(connString);
var commandText = BuildCommandText();
var sqlComm = new SqlCommand(commandText, sqlConn);

string connString = BuildConnectionString();
SqlConnection sqlConn = new SqlConnection(connString);
string commandText = BuildCommandText();
SqlCommand sqlComm = new SqlCommand(commandText, sqlConn);

當使用MVC並讓客戶端控制器返回所有ajax請求時,您幾乎總是使用var,因為使用匿名類型時,您只能將應用程序所需的數據發送回客戶端。

var response = new { var1 = "bla", var2 = "foo" };
return JSon(response);

我幾乎每個賦值給局部變量使用var。 如果特定方法的返回類型發生更改,這實際上限制了我必須進行的代碼更改量。 例如,如果我有以下方法:

List<T> GetList()
{
    return myList;
}

我可以在整個地方進行代碼行,進行局部變量賦值,如下所示:

List<T> list = GetList();

如果我更改GetList()以返回IList <T>,那么我必須更改所有這些賦值行。 如果我更改返回類型,N行賦值等於N + 1代碼更改。

IList<T> GetList()
{
    return myList;
}

相反,如果我編碼如下:

var list = GetList();

然后我只需要更改GetList(),其余的將通過編譯進行驗證。 我們只使用一次代碼更改即可運行。 當然,如果根據列表的代碼是List <T>而不是IList <T>,編譯器會抱怨; 但那些應該少於N.

我已經在某處讀過,如果你在一個非你編寫的模塊中調用代碼,並且返回一個類型的對象將來會發生變化,那么建議你使用“var”。 如果要為該外部模塊編寫包裝器,並且只轉發結果,而不是使用var來臨時存儲它,如果/當外部調用返回的數據類型發生更改時,將使代碼仍然有效。 此外,如果您知道此結果是某種類型的集合,但同樣不是特別穩定的類型,則分配給var然后迭代仍然可以在進一步更改時使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM