Nếu tôi định nghĩa một struct trong C# sử dụng thuộc tính tự động như thế này:Tại sao cần gọi: this() trên cấu trúc để sử dụng các thuộc tính tự động trong C#?
public struct Address
{
public Address(string line1, string line2, string city, string state, string zip)
{
Line1 = line1;
Line2 = line2;
City = city;
State = state;
Zip = zip;
}
public string Line1 { get; protected set; }
public string Line2 { get; protected set; }
public string City { get; protected set; }
public string State { get; protected set; }
public string Zip { get; protected set; }
}
Khi tôi cố gắng để xây dựng các tập tin, tôi nhận được một lỗi biên dịch nói The 'this' object cannot be used before all of its fields are assigned to
. Điều này có thể được giải quyết bằng cách thay đổi hàm khởi tạo để thực hiện cuộc gọi bị xích tới hàm tạo mặc định như sau:
public Address(string line1, string line2, string city, string state, string zip): this()
{
Line1 = line1;
Line2 = line2;
City = city;
State = state;
Zip = zip;
}
Câu hỏi của tôi là, tại sao lại hoạt động và điều gì đang xảy ra? Tôi đoán, và tôi cố gắng chứng minh điều đó bằng cách nhìn vào IL, nhưng tôi chỉ đùa với bản thân nếu tôi nghĩ tôi có thể phá vỡ IL. Nhưng tôi đoán là, tính chất tự động hoạt động bằng cách có trình biên dịch tạo ra các trường cho thuộc tính của bạn đằng sau hậu trường. Những trường này không thể được truy cập thông qua mã, tất cả các thiết lập và nhận phải được thực hiện thông qua các thuộc tính. Khi tạo một cấu trúc, một hàm tạo mặc định không thể được định nghĩa rõ ràng. Vì vậy, đằng sau hậu trường, trình biên dịch phải tạo một hàm tạo mặc định để đặt các giá trị của các trường mà nhà phát triển không thể nhìn thấy.
Bất kỳ và tất cả pháp sư IL đều được hoan nghênh chứng minh hoặc bác bỏ lý thuyết của tôi.
Thành viên 'protected' mới không được phép trong một' struct' giống như nó không được phép trong một 'lớp niêm phong'. –