Sự khác biệt giữa loại ẩn danh và bộ dữ liệu là gì?Loại và bộ ẩn danh
Trả lời
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.
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ó ID
và Name
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 Item1
và Item2
.
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 đè Equals
và GetHashCode
) dựa trên các thuộc tính theo mặc định.
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.
- 1. Bộ sưu tập loại ẩn danh?
- 2. Danh sách các loại ẩn danh?
- 3. Các lớp ẩn danh Java và Bộ gom rác
- 4. Loại đối số của hàm ẩn danh
- 5. Tham gia loại ẩn danh trong LINQ
- 6. truyền loại ẩn danh sang giao diện?
- 7. Thiết lập thuộc tính loại ẩn danh
- 8. Cú pháp khó hiểu với các loại mẫu ẩn danh?
- 9. Từ điển giá trị là loại ẩn danh trong C#
- 10. JAXB: Các loại đơn giản ẩn danh là enums?
- 11. Cách đọc thuộc tính của một loại ẩn danh?
- 12. Các loại ẩn danh cho một mảng đối tượng?
- 13. Thêm thuộc tính vào loại ẩn danh sau khi tạo
- 14. Scala ActionListener/loại chức năng ẩn danh không phù hợp
- 15. Truy cập C# Loại đối tượng ẩn danh
- 16. Java: enums ẩn danh?
- 17. Cast Danh sách loại Ẩn danh vào Danh sách các đối tượng động
- 18. các loại vô danh và generics
- 19. Tùy chọn Loại nghiêm ngặt và ẩn danh không đi cùng nhau?
- 20. Các loại ẩn danh và Nhận các trình truy cập trên WP7.1?
- 21. Nội bộ V8 - Xử lý các chức năng ẩn danh
- 22. Giao diện, Phương thức ẩn danh và Rò rỉ bộ nhớ
- 23. HTML5 ẩn bộ nhớ đệm
- 24. cách đảo ngược danh sách ẩn danh trong bộ công cụ mẫu?
- 25. Ẩn danh kho lưu trữ git cục bộ?
- 26. Tại sao sử dụng loại công việc ẩn danh và sử dụng loại rõ ràng không có trong GroupBy?
- 27. danh sách trả về với loại ẩn danh trong khung thực thể
- 28. EF4 làm cách nào để chuyển đổi loại ẩn danh thành loại mạnh trong LINQ
- 29. Automapper DynamicMap không lập bản đồ Danh sách các loại ẩn danh
- 30. Sự khác biệt giữa Bộ đệm ẩn HttpRuntime và Bộ đệm ẩn HttpContext là gì?
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 –