Trong .net, một phương pháp dụ struct là ngữ nghĩa tương đương với một phương pháp cấu trúc tĩnh với một một ref
tham số phụ của struct kiểu. Như vậy, với tuyên bố:
struct Blah {
public int value;
public void Add(int Amount) { value += Amount; }
public static void Add(ref Blah it; int Amount; it.value += Amount;}
}
Phương pháp này gọi là:
someBlah.Add(5);
Blah.Add(ref someBlah, 5);
ngữ nghĩa tương đương, ngoại trừ một sự khác biệt: các cuộc gọi sau này sẽ chỉ được phép nếu someBlah
là một vị trí lưu trữ có thể thay đổi (biến, lĩnh vực, vv) và không nếu nó là một vị trí lưu trữ chỉ đọc, hoặc một giá trị tạm thời (kết quả của việc đọc một tài sản, vv).
Điều này đối diện với các nhà thiết kế ngôn ngữ .net: không cho phép sử dụng bất kỳ chức năng thành viên nào trên cấu trúc chỉ đọc sẽ gây khó chịu, nhưng họ không muốn cho phép các hàm thành viên ghi vào các biến chỉ đọc. Họ quyết định "punt", và làm cho nó để gọi một thể hiện phương thức trên một cấu trúc chỉ đọc sẽ tạo một bản sao của cấu trúc, gọi hàm trên đó, và sau đó loại bỏ nó. Điều này có tác dụng làm chậm các cuộc gọi đến các phương thức ví dụ không viết cấu trúc bên dưới và làm cho nó cố gắng sử dụng phương thức cập nhật cấu trúc cơ bản trên cấu trúc chỉ đọc sẽ mang lại ngữ nghĩa bị hỏng khác nhau từ sẽ đạt được nếu nó được truyền trực tiếp. Lưu ý rằng thời gian thêm được thực hiện bởi bản sao sẽ hầu như không bao giờ mang lại ngữ nghĩa chính xác trong các trường hợp không đúng nếu không có bản sao.
Một trong những mối quan tâm chính của tôi trong .net là vẫn còn (ít nhất là 4.0 và có lẽ 4.5) vẫn không có thuộc tính qua đó hàm thành viên cấu trúc có thể cho biết liệu nó có sửa đổi this
hay không.Con người đường sắt về cách cấu trúc nên được bất biến, thay vì cung cấp các công cụ để cho phép cấu trúc để cung cấp một cách an toàn phương pháp đột biến. Điều này, mặc dù thực tế rằng cái gọi là cấu trúc "không thay đổi" là một lời nói dối. Tất cả các loại giá trị không tầm thường trong các vị trí lưu trữ có thể thay đổi đều có thể thay đổi được vì tất cả các loại giá trị được đóng hộp. Tạo cấu trúc "không thay đổi" có thể buộc phải viết lại toàn bộ cấu trúc khi chỉ muốn thay đổi một trường, nhưng từ struct1 = struct2
biến đổi struct1 bằng cách sao chép tất cả các trường công khai và riêng tư từ struct2 và không có định nghĩa kiểu cho cấu trúc có thể làm để ngăn chặn điều đó (ngoại trừ không có bất kỳ trường nào) nó không làm gì để ngăn chặn đột biến đột biến của các thành viên struct. Hơn nữa, bởi vì các vấn đề luồng, cấu trúc rất hạn chế trong khả năng của họ để thực thi bất kỳ loại mối quan hệ bất biến giữa các lĩnh vực của họ. IMHO, nói chung sẽ tốt hơn cho một cấu trúc để cho phép truy cập trường tùy ý, làm rõ rằng bất kỳ mã nào nhận được cấu trúc phải kiểm tra xem các trường của nó có đáp ứng tất cả các điều kiện được yêu cầu không, hơn là cố gắng ngăn chặn sự hình thành các cấu trúc không đáp ứng điều kiện.
Xem [Làn sóng chỉ đọc đột biến "của Eric Lippert] (http://blogs.msdn.com/b/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx) –
* Tại sao * bạn mong đợi hai giây? Bạn nói rằng bạn muốn nó được chỉ đọc, vậy tại sao bạn muốn nó thay đổi? –