Kicking xung quanh một số cấu trúc nhỏ trong khi trả lời this post, tôi đi qua sau bất ngờ: Cấu trúc sauThuộc tính và cấu trúc tự động Không kết hợp?
, sử dụng một trường int là hoàn toàn hợp pháp:
struct MyStruct
{
public MyStruct (int size)
{
this.Size = size; // <-- Legal assignment.
}
public int Size;
}
Tuy nhiên, cấu trúc sau đây, sử dụng hộp số tự động thuộc tính không biên dịch:
struct MyStruct
{
public MyStruct (int size)
{
this.Size = size; // <-- Compile-Time Error!
}
public int Size{get; set;}
}
Lỗi trả về là "Không thể sử dụng đối tượng" này 'trước khi tất cả các trường được gán cho ". Tôi biết rằng đây là quy trình chuẩn cho một cấu trúc: trường sao lưu cho bất kỳ thuộc tính nào phải được gán trực tiếp (và không phải thông qua bộ truy cập được đặt của thuộc tính) từ bên trong hàm tạo của cấu trúc.
Một giải pháp là sử dụng một trường ủng hộ rõ ràng:
struct MyStruct
{
public MyStruct(int size)
{
_size = size;
}
private int _size;
public int Size
{
get { return _size; }
set { _size = value; }
}
}
(Lưu ý rằng VB.NET sẽ không có vấn đề này, bởi vì trong VB.NET mọi lĩnh vực sẽ được tự động khởi tạo 0/null/sai khi lần đầu tiên được tạo.)
Điều này có vẻ là một giới hạn không may khi sử dụng thuộc tính tự động với cấu trúc trong C#. Suy nghĩ về khái niệm, tôi đã tự hỏi nếu đây không phải là một nơi hợp lý để có một ngoại lệ cho phép thuộc tính thiết lập accessor được gọi trong constructor của struct, ít nhất là cho một thuộc tính tự động?
Đây là một vấn đề nhỏ, gần như một cạnh hợp cụ thể, nhưng tôi đã tự hỏi những gì người khác nghĩ về điều này ...
Các trường trong C# cũng được khởi tạo thành 0/null/false. Hãy nhớ thời gian chạy của nó, không phải là ngôn ngữ cụ thể. ;) –
Không dành cho các trường cấu trúc trong C#. Đối với một cấu trúc, các trường phải được khởi tạo bởi hàm dựng rõ ràng hoặc bởi người gọi nếu sử dụng hàm tạo ngầm, không có tham số. VB.NET không có giới hạn này và, do đó, ví dụ ở trên, sẽ không biên dịch trong C# sẽ biên dịch và chạy tốt trong VB.NET. –
bản sao có thể có của [Tại sao cần phải gọi: this() trên cấu trúc để sử dụng các thuộc tính tự động trong C#?] (Http://stackoverflow.com/questions/272153/why-is-it-necessary-to-call -this-on-a-struct-to-use-tự động-tài sản-in-c) – nawfal