簡體   English   中英

C# 中類型推斷的優缺點是什么?

[英]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.

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