2010-04-10 27 views
22

Sự khác biệt giữa loại ẩn danh và bộ dữ liệu là gì?Loại và bộ ẩn danh

+2

Dưới đây là một bài viết giải thích những gì bạn muốn: http://msdn.microsoft.com/en-us/vcsharp/ee957397.aspx –

Trả lời

14

Các loại ẩn danh có tên thuộc tính mang nhiều thông tin hơn, đối với các bộ dữ liệu bạn không có. Bạn không thể sử dụng các kiểu nặc danh như các giá trị trả về và các tham số mặc dù bạn có thể với các bộ dữ liệu.

Ví dụ về khi nào một bộ tếu đẹp là khi bạn muốn trả lại nhiều giá trị. @Petar Minchev mentions this link đưa ra một ví dụ điển hình.

Bạn có thể muốn có phương thức Find() trả về cả chỉ mục và giá trị. Một ví dụ khác sẽ là vị trí trong mặt phẳng 2d hoặc 3d.

18

Tuple không phải là một loại ẩn danh, đó là loại được đặt tên. Bạn có thể sử dụng nó như một kiểu trả về hoặc đối số phương thức. Mã này hợp lệ:

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

Bạn không thể làm điều này với loại ẩn danh, bạn phải trả lại System.Object để thay thế. Thông thường, bạn sẽ phải sử dụng Reflection trên các đối tượng này (hoặc dynamic trong .NET 4) để có được các giá trị của các thuộc tính riêng lẻ.

Ngoài ra, như Brian đề cập, tên tài sản trên một Tuple được cố định - chúng tôi luôn Item1, Item2, Item3 và như vậy, trong khi với một loại vô danh bạn có thể chọn các tên. Nếu bạn viết:

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

Sau đó, loại vô danh thực sự có IDName tài sản. Nhưng nếu bạn viết:

Tuple.Create(1, "Bob") 

Sau đó tuple kết quả chỉ có tính chất Item1Item2.

8

Một điểm khác có lợi cho các loại ẩn danh là bạn có thể dễ dàng có hơn 8 thuộc tính. Trong khi điều này là doable bằng cách sử dụng tuples, nó không phải là quá đẹp.

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

hoặc viết các lớp tuple của riêng bạn.


Một sự tương đồng thú vị cần lưu ý là tất cả các bộ và các kiểu nặc danh cung cấp cho bạn tính bất biến và so sánh bình đẳng (cả ghi đè EqualsGetHashCode) dựa trên các thuộc tính theo mặc định.

8

Chỉ cần cập nhật một chút cho câu trả lời này vì C# 7 ở ngoài tự nhiên. Tuples có quyền lực siêu bây giờ và đôi khi có thể thay thế các loại và lớp ẩn danh. Lấy ví dụ phương thức này chấp nhận và trả về các bộ dữ liệu với các thuộc tính được đặt tên.

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()); 
} 

Thật tuyệt.

Các vấn đề liên quan