2010-04-10 151 views
22

匿名類型和元組有什麼區別?匿名類型和元組

+2

這裏是一篇文章解釋你想要什麼:http://msdn.microsoft.com/en-us/vcsharp/ee957397.aspx – 2010-04-10 15:14:47

回答

14

匿名類型具有帶有更多信息的屬性名稱,對於不具有此屬性的元組。你不能使用匿名類型作爲返回值和參數,而你可以使用元組。

元組好時的例子是當你想返回多個值時。 @Petar Minchev mentions this link這是一個很好的例子。

您可能需要一個返回索引和值的Find()方法。另一個例子是在2D或3D平面上的位置。

18

元組不是匿名類型,它是一個命名類型。您可以將其用作返回類型或方法參數。此代碼是有效的:

Tuple<int, string> GetTuple() 
{ 
    return Tuple.Create(1, "Bob"); 
} 

你不能用匿名類型做到這一點,你就必須返回System.Object代替。通常,您最終必須對這些對象使用Reflection(或.NET 4中的dynamic)才能獲取各個屬性的值。

而且,正如布賴恩提到,在Tuple屬性名稱是固定的 - 他們總是Item1Item2Item3等,而用一個匿名類型可以選擇任何名稱。如果你寫:

var x = new { ID = 1, Name = "Bob" } 

然後匿名類型實際上有IDName性能。但是,如果你寫:

Tuple.Create(1, "Bob") 

然後將生成的元組只是有性能Item1Item2

8

另一個有利於匿名類型的觀點是,您可以輕鬆擁有超過8個屬性。雖然這可以通過元組來實現,但它並不那麼漂亮。

var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on 

或者寫自己的元組類。


一個有趣的相似性要注意的是,無論是元組和匿名類型給你不變性以及基於默認的屬性平等可比性(包括覆蓋EqualsGetHashCode)。

8

自從C#7出現在野外以後,對此答案進行了一些更新。元組現在擁有超能力,有時可以替換匿名類型和類。舉例來說,這個方法接受並返回具有命名屬性的元組。

void Main() 
{ 
    var result = Whatever((123, true)); 
    Debug.Assert(result.Something == 123); 
    Debug.Assert(result.Another == "True"); 
} 

(int Something, string Another) Whatever((int Neat, bool Cool) data) 
{ 
    return (data.Neat, data.Cool.ToString()); 
} 

這很酷。