Tất cả over Stack Overflow và internet tôi thấy rằng đó là một nguyên tắc thiết kế tốt để giữ cho cấu trúc không thay đổi được. Thật không may, tôi không bao giờ thấy bất kỳ triển khai nào thực sự khiến các cấu trúc này thực sự không thay đổi được.Làm cách nào để tạo cấu trúc không thay đổi?
Giả sử rằng một cấu trúc không có bất kỳ loại tham chiếu nào bên trong nó, làm cách nào để thực sự tạo cấu trúc không thay đổi? Đó là, làm cách nào để ngăn chặn đột biến của bất kỳ trường nguyên thủy nào của nó (có lẽ do một ngoại lệ biên dịch/thời gian chạy)?
Tôi đã viết một bài kiểm tra đơn giản cố gắng tạo ra một cấu trúc bất biến, nhưng thậm chí không sử dụng System.ComponentModel.ImmutableObjectAttribute
làm việc:
class Program
{
static void Main(string[] args)
{
ImmutableStruct immStruct1 = new ImmutableStruct();
Console.WriteLine(immStruct1); //Before mutation.
immStruct1.field1 = 1;
immStruct1.field2 = "Hello";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 1st mutation.
immStruct1.field1 = 2;
immStruct1.field2 = "World";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 2nd mutation.
Console.ReadKey();
}
}
[ImmutableObject(true)]
struct ImmutableStruct
{
public int field1;
public string field2;
public object field3;
public override string ToString()
{
string field3String = "null";
if (field3 != null)
{
field3String = field3.GetHashCode().ToString();
}
return String.Format("Field1: {0}, Field2: {1}, Field3: {2}", field1, field2, field3String);
}
}
Một chút OT, nhưng có lý do cụ thể nào bạn cần cấu trúc thay vì chỉ sử dụng lớp học không? Tôi đã không tìm thấy một trường hợp sử dụng mà một struct là thích hợp hơn một lớp học trong nhiều năm lập trình LOB. – StingyJack
Đánh dấu các trường là chỉ đọc? Ngoài ra, bạn đã thấy điều này: http://stackoverflow.com/questions/29974301/should-a-c-sharp-struct-have-only-read-only-properties – Pawel
Cấu trúc trong tâm trí tương tự như cấu trúc bitfield của C++. Cấu trúc được khởi tạo, và mong muốn của tôi là cấu trúc sẽ không bao giờ được thay đổi - có một lời hứa được thực hiện rằng tôi đã không sửa đổi dữ liệu một cách tình cờ. –