2010-02-15 8 views
30

Dường như không có cách nào như các loại ẩn danh lấy được từ đối tượng. Nhưng tôi nghĩ rằng tôi sẽ hỏi từ rất nhiều thời gian chúng tôi sử dụng các loại vô danh trong các biểu thức truy vấn đơn giản để trích xuất các tập con dữ liệu được sử dụng trong các loại ẩn danh mà chúng tôi tạo ra. Nó chỉ có vẻ với tôi họ nên được structs (loại giá trị) cho hiệu quả bộ nhớ lớn hơn so với các loại tài liệu tham khảo.Có cách nào để tạo cấu trúc ẩn danh trong C# không?

Suy nghĩ?

+0

Đây sẽ là giải pháp thay thế lý tưởng cho các lớp ẩn danh trong trường hợp GC đột biến không mong muốn. –

Trả lời

28

Không có không C# Cú pháp hỗ trợ mà sẽ tạo cấu trúc vô danh

+9

Thở dài. Bummer dood. {-o) – Boydski

+0

Đây là trường hợp của C# 7.0. Tôi cảm thấy sẽ tốt khi chỉ ra số phiên bản trong trường hợp câu trả lời này không chính xác với việc phát hành phiên bản cú pháp mới (ví dụ: 7.2, 8.0). –

3

Bạn đã cấu hình ứng dụng của bạn và tìm thấy các loại vô danh trở thành một phần chậm nhất của nó? Nếu vậy, tôi đề nghị bạn tự tạo các cấu trúc cần thiết và kiểm tra lại để xem có khắc phục được sự cố của bạn hay không. Nếu không, tôi muốn dành nhiều thời gian lo lắng về vấn đề kinh doanh trong tầm tay và ít thời gian hơn (như tính năng cho phép).

+5

Xin lỗi, không có nghĩa là có bất kỳ vấn đề gì. Không có gì. Tôi luôn luôn tìm cách để giảm gánh nặng cho GC như một vấn đề về nguyên tắc. Bất cứ lúc nào tôi có thể đặt các thứ lên ngăn xếp, tôi làm. Các loại đơn giản chỉ có ở đó vì việc truyền tải dữ liệu đơn giản sẽ được phân phát tốt nhất để có trên ngăn xếp. – Boydski

+2

Nếu bạn chọn công cụ từ hộp công cụ, bạn cũng có thể chọn công cụ tốt hơn, miễn là chính lựa chọn đó không lãng phí thời gian. –

12

UPDATE:. C# 7 hiện nay có các bộ giá trị-type, có thể được sử dụng trong các loại cùng một bối cảnh mà tham khảo kiểu kiểu nặc danh được sử dụng trong


Dường như có này thường cầm ý tưởng rằng các loại giá trị "hiệu quả hơn" so với các loại tham chiếu. Điều này hoàn toàn là huyền thoại; chúng hiệu quả hơn đối với một số hoạt động và ít hiệu quả hơn cho người khác.

Ví dụ: loại giá trị lớn kém hiệu quả hơn so với loại tham chiếu nếu đơn vị công việc bạn quan tâm là "sao chép giá trị sang vị trí mới" hoạt động. Một kiểu tham chiếu sẽ sao chép một tham chiếu có kích thước con trỏ không phụ thuộc vào kích thước của dữ liệu được giới thiệu và do đó các bản sao trong một lệnh máy được tối ưu hóa cao nhất. Một loại giá trị sao chép kích thước của dữ liệu mỗi lần duy nhất, có thể khá lớn và có nhiều hướng dẫn.

Bất kể, các loại ẩn danh chỉ là tính năng tiện lợi. Nếu bạn không thích đặc điểm hiệu suất của chúng, bạn không phải sử dụng chúng. Bạn có thể xác định cấu trúc của riêng bạn nếu bạn muốn.

+18

Xin lỗi Eric. Câu hỏi có thể đã thanh lịch hơn. Tôi hoàn toàn nhận thức được điều này xoay quanh bối cảnh. Người ta phải luôn luôn sử dụng trí tuệ khi chọn giá trị so với các loại tham chiếu cho các chức năng phức tạp hơn. Nhưng hầu hết các ví dụ về các loại anon tôi đã nhìn thấy liên tục tạo và phá hủy các thể hiện nhỏ của các đối tượng (từ 3 đến 5 giá trị thành viên hoặc hơn); đối tượng đang được sử dụng như một phương tiện đơn giản chỉ là truyền dữ liệu đơn giản trên Gen 0 của heap. Nó rõ ràng là tốn kém hơn so với làm như vậy trên stack. Tôi thích sự tiện lợi của các loại vô danh. Nhưng nó vẫn sẽ là tuyệt vời để có thể lựa chọn giữa ref so với giá trị. – Boydski

+0

Vâng, đây là một tính năng tiện lợi, một tính năng rất hữu ích để lặp qua một loại hợp chất đặc biệt tổng hợp một số thông tin và bạn không muốn giữ bất kỳ nơi nào khác ngoài ngữ cảnh hiện đang thực hiện. –

-1

đôi khi tôi sử dụng đối tượng ẩn danh:

var x = new 
{ 
    itm0 = new { key = "key0", val = 0}, 
    itm1 = new { key = "key1", val = 1}, 
}; 
+0

Câu trả lời của bạn có trả lời câu hỏi của OP không? – nawfal

+2

Câu trả lời của bạn sai hoặc bạn trả lời sai câu hỏi. OP hỏi chúng tôi có thể xây dựng cấu trúc ẩn danh không. Bạn đang xây dựng một lớp ẩn danh với các lớp ẩn danh được nhúng. –

2

Đối với nhiều trường hợp sử dụng, các loại vô danh và các bộ sẽ hiệu quả hơn nếu thực hiện như cấu trúc công trường hơn các lớp học như bất biến; cho dù một loại ẩn danh cụ thể hoặc bộ tuple sẽ hiệu quả hơn vì cấu trúc như vậy hay là một lớp bất biến không phải là một chức năng đặc biệt về kích thước của nó, mà là một hàm của nó được sử dụng như thế nào. Nếu một thứ không bao giờ được đóng hộp, chi phí tương đối của việc sử dụng cấu trúc so với một lớp sẽ phụ thuộc vào kích thước và số lần vật cần phải được sao chép (lưu ý rằng các cấu trúc "không thay đổi" thường phải được sao chép nhiều lần hơn so với cấu trúc trường công cộng). Nếu một điều chỉ được sao chép một hoặc hai lần sau khi xây dựng (phổ biến trong nhiều tình huống sử dụng), một cấu trúc trường công cộng là thực tế bất kỳ kích thước sẽ hoạt động tốt hơn so với một lớp không thể thay đổi. Mặt khác, nếu một thứ sẽ thường xuyên bị ép buộc thành kiểu tham chiếu, một lớp bất biến sẽ tốt hơn đáng kể so với cấu trúc, cho dù nhỏ như thế nào.

Chi phí của các loại cấu trúc co giật đối với các loại tham chiếu và thực tế là một số trường hợp sử dụng sẽ yêu cầu thường xuyên, có nghĩa là đối với hầu hết các cấu trúc đối tượng tạm thời sẽ hiệu quả hơn các đối tượng lớp không thay đổi. kém hiệu quả hơn việc sử dụng các đối tượng lớp bất biến cho mọi thứ. Các trường hợp sử dụng trong đó các cấu trúc sẽ cho phép hiệu suất tổng thể được cải thiện từ 10% trở lên có thể quá hiếm để biện minh cho chi phí có hai loại bộ dữ liệu khác nhau và hai loại ẩn danh khác nhau.Mã cần các lợi thế về hiệu năng của các cấu trúc trường mở có thể dễ dàng xác định đủ các loại cấu trúc cho các mục đích chính xác của chúng.