![](/img/trans.png)
[英]What are the advantages and disadvantages of having multiple small methods in a C# program?
[英]What are some advantages & disadvantages of type inference in C#?
我有一個同事反對 C# 中的類型推斷。 我相信他的大部分論點都缺乏可讀性。 我的反對意見是,Visual Studio 的智能感知功能提供了一種查看類型的簡單方法,並且從代碼中讀取它們並不像我們在記事本之外編寫代碼那樣必要。
但是,我很好奇在 C# 中使用類型推斷的優缺點。 我來自 C++,我知道 C++0x 的“自動”有一個更客觀的好處,因為你並不總是知道你得到的類型(尤其是在進行大量模板編程時)。 一個例子是使用 auto 來存儲 Boost.Bind 的值。
在 C# 中,類型推斷的要求似乎並不像它是“很高興擁有”或糖衣功能那樣多。 我認為在處理長類型時會很有用,例如:
Lazy<List<MyNamespace.ISomeVeryLongInterfaceType>> myVar = obj.GetLazy();
這將是:
var myVar = obj.GetLazy();
在我看來,這要干凈得多。 但是,OR 是否有任何反對類型推斷的客觀論據? 使用它是否是一種良好的編程習慣,即使在有爭議的情況下它沒有提供任何好處(例如,使用“var”而不是“int”)?
理解我應該如何在日常編碼中使用“var”的一些幫助會很棒。
類型推斷的發明正是出於您為 C++ 提供的原因,您可以創建沒有類型名稱的匿名類型(特別是請參閱 Lambdas 和 Linq)。
所以在這種情況下是需要的。
在另一種情況下(當類型名稱已知時)則歸結為樣式。 當類型非常明顯時,我使用var
:
// I like this - less duplication and easier to read
var item = new List<ComplexObjectItem>();
代替:
List<ComplexObjectItem> item = new List<ComplexObjectItem>();
因為它減少了重復。
但是,當類型對讀者來說不是很明顯時,我不喜歡使用它:
// I don't like this - I need to look up what the type is
var item = ResultOfSomeFunctionWhereICantSeeWhatItIs();
但是您的里程可能會有所不同。
隱式類型在某些情況下很有用,而在其他情況下則有害。 Eric Lippert 最近發表了一篇關於隱式類型的使用和誤用的文章,值得一讀。
需要記住的一件事是, var
僅供用戶使用,編譯器在編譯時將其轉換為其具體表示。
一個缺點是使用類的接口時。
假設GetCurrentList()
返回一個IList<string>
:
IEnumerable<string> list = GetCurrentList();
和
var list = GetCurrentList();
與第二個示例不同, list 將是一個IList<string>
。
我傾向於使用顯式類型,並且通常僅在有助於代碼可讀性和使用匿名類型時才使用var
(因為此時您必須這樣做)。
我認為常識決定了以下非正式規則:
如果有一些長名稱,例如:
Lazy<List<MyNamespace.ISomeVeryLongInterfaceType>> myVar = new Lazy<List<MyNamespace.ISomeVeryLongInterfaceType>>();
然后用
var myVar = new Lazy<List<MyNamespace.ISomeVeryLongInterfaceType>>();
是有道理的,因為您仍然可以分辨出對象是什么。
另一方面,一些模棱兩可的東西可能保證不使用var
:
Lazy<List<MyNamespace.ISomeVeryLongInterfaceType>> myVar = doProcess();
var myVar = obj.GetLazy();
在智能感知存在的情況下,這種類型推斷是一個大致的好主意,或者可以。 但是,如果沒有智能感知,那么我不會認為這是一個好主意。 相反,這將是一場噩夢。 如果沒有智能感知,我相信大多數開發人員會不喜歡它,因為缺乏智能感知(和精確類型,兩者)造成的不便。
但是,即使沒有智能感知,以下內容也很好:
var obj = new Lazy<List<MyNamespace.ISomeVeryLongInterfaceType>();
在這種情況下,類型推斷是一種解脫,因為它避免了大量輸入和重復輸入!
有或沒有智能感知,我更喜歡寫:
Lazy<List<MyNamespace.ISomeVeryLongInterfaceType> obj= obj.GetLazy();
我喜歡使用類型推斷來使代碼更簡潔,但是我只在我可以在同一行看到它是什么類型時才使用它,例如:
var myClass = new MyClass();
但
MyClass myClass = RandomFuncThatGetsObject();
我認為在第一個示例中使用 var 不會影響可讀性,實際上它使其更具可讀性,但是在第二個示例中使用 var 會影響可讀性。
當您使用匿名類型時,類型推斷是必要的:
var x = new { Greeting = "Hello", Name = "World" };
使用 LINQ 查詢時,通常始終使用匿名類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.