2012-10-05 42 views
6

Trong khi đi qua các tài liệu ASP.NET MVC Tôi thấy thành ngữ này được sử dụng rất nhiều:từ khóa mới mà không cần tên lớp trong C#

new { foo = "bar", baz = "foo" } 

Đây có phải là một từ điển cú pháp theo nghĩa đen? Đây có phải là một lớp/cấu trúc mới với kiểu được phỏng đoán theo định nghĩa hàm được gọi không? Nếu nó là như thế nào đến các lọ không cần một định nghĩa loại, thậm chí không var?

Trả lời

10

Đây là loại ẩn danh.

loại Anonymous cung cấp một cách thuận tiện để đóng gói một bộ tính read-only vào một đối tượng duy nhất mà không cần phải rõ ràng định nghĩa một kiểu đầu tiên. Tên loại được tạo bởi trình biên dịch và là không có sẵn ở cấp mã nguồn. Loại của mỗi thuộc tính là phỏng đoán bởi trình biên dịch.

http://msdn.microsoft.com/en-us/library/bb397696.aspx

  • loại Anonymous được đánh mạnh. Từ quan điểm của thời gian chạy ngôn ngữ chung, một loại ẩn danh không khác với bất kỳ loại tham chiếu nào khác.

  • Nếu hai hoặc nhiều loại ẩn danh trong cùng một cụm có cùng số lượng và loại thuộc tính, theo cùng thứ tự, trình biên dịch coi chúng là cùng loại. Chúng chia sẻ cùng một thông tin kiểu được tạo bởi trình biên dịch.

  • Các loại vô danh không được chuyển giữa các hội đồng hoặc thậm chí là return values từ các phương pháp (có thể, nhưng hiếm khi, hiếm khi được khuyến khích).

  • Loại ẩn danh là một cơ chế thuận tiện, ví dụ: khi làm việc với LINQ, chẳng hạn như projection sau:

LINQ Ví dụ

var result = myEnumerable.Select(o => new { foo = o.Foo, bar = o.Bar }); 
// "result" is an enumerable of a new anonymous type containing two properties 

Câu hỏi khác

Đây có phải là một từ điển cú pháp theo nghĩa đen?

Không, mặc dù có nhiều điểm tương đồng. ASP .Net MVC sử dụng RouteValueDictionary và các loại ẩn danh để đại diện cho cùng một thông tin trong quá tải nhiều phương thức.

cách thức các vars không cần định nghĩa loại, thậm chí không phải là var?

loại giá trị gia tăng là suy ra, mặc dù suy luận không phải lúc nào cũng có thể: http://msdn.microsoft.com/en-us/library/bb531357.aspx (phiên bản VB, nếu ai đó biết URL của C# tương đương vui lòng cập nhật)

+0

Câu trả lời hay. Cảm ơn! – improv32

4

Đây là một anonymous type syntax. Tên kiểu được tạo bởi trình biên dịch và không có sẵn ở cấp mã nguồn. Loại của mỗi thuộc tính được suy ra bởi trình biên dịch.

2

Đây là vô danh loại. Điều đó có nghĩa là nó trả về một cái gì đó có thuộc tính foo, một thuộc tính baz cả hai loại chuỗi.

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