Tôi biết rằng khi chúng ta sử dụng tài sản trong C#, trình biên dịch luôn tạo getter và setter cho họ trong MSIL (ví dụ, get_PropertyName và set_PropertyName), ví dụ, hãy xem xét các đoạn mã sau:Thuộc tính C# luôn có trường sao lưu "đằng sau cảnh"?
class Program
{
class Test
{
public string Name { get; set; }
}
static void Main(string[] args)
{
//Here I'm using reflection to inspect methods of Test class
Type type = typeof(Test);
foreach (var item in type.GetMethods())
{
Console.WriteLine(item.Name);
}
}
}
Chương trình này sẽ sản xuất đầu ra với các phương pháp của Test
, trong đó sẽ có get_Name
và set_Name
- bộ thu thập và setters mà tôi đã nói đến. Trong sự hiểu biết của tôi sau đó, nếu getters và setter được tạo ra "đằng sau hậu trường" thì sẽ có một trường sao lưu được tạo ra cũng từ đó/mà getters và setter có được/đặt giá trị. Vì vậy, từ ví dụ trước, tôi có thể dùng phản ánh để kiểm tra các lĩnh vực cho các lớp học thử nghiệm, như vậy:
static void Main(string[] args)
{
Type type = typeof(Test);
foreach (var item in type.GetFields())
{
Console.WriteLine(item.Name);
}
}
Các ouput của chương trình này là trống rỗng, tôi giả sử điều này là do lĩnh vực sao lưu được tạo ra có private
truy cập, vì vậy chúng tôi không thể nhìn thấy nó. Nhưng kể từ khi tôi không biết làm thế nào để kiểm tra nó, bạn có thể vui lòng cho tôi biết nếu một lĩnh vực sao lưu luôn luôn được tạo ra (ngay cả khi chúng tôi có một tài sản đơn giản chỉ với get;
và)?
Theo như tôi biết họ làm. – Alex
Chỉ để bạn có thể tìm tài liệu tham khảo khác dễ dàng hơn: chúng thường được gọi là trường * sao lưu *, không phải * trường sao lưu *. –
Hài hước rằng một tính năng được thêm vào trong các phiên bản sau của C# đã làm lu mờ sử dụng chính của họ. – IllidanS4