Không, không. Tôi vừa được thử nghiệm với các lớp sau:
public abstract class Class1
{
public abstract string TestStringAbstract { get; set; }
public string TestString { get; set; }
}
và giải mã nó trong Reflector. Đây là mã được tạo:
public abstract class Class1
{
// Fields
[CompilerGenerated]
private string <TestString>k__BackingField;
// Methods
protected Class1()
{
}
// Properties
public string TestString
{
[CompilerGenerated]
get
{
return this.<TestString>k__BackingField;
}
[CompilerGenerated]
set
{
this.<TestString>k__BackingField = value;
}
}
public abstract string TestStringAbstract { get; set; }
}
Như bạn có thể thấy chỉ một trường sao lưu đơn được tạo cho thuộc tính cụ thể. Bản tóm tắt được để lại dưới dạng định nghĩa. Điều này có ý nghĩa logic vì thuộc tính phải được ghi đè bởi bất kỳ lớp con nào không có điểm tạo trường sao lưu sẽ không có cách nào truy cập (vì bạn không bao giờ có thể truy cập thuộc tính trừu tượng).
Mặt khác, thuộc tính ảo sẽ tạo trường sao lưu và bất kỳ lớp nào ghi đè thuộc tính bằng thay thế được tự động triển khai sẽ tạo trường sao lưu riêng ở cấp đó.
Nguồn
2009-12-09 21:49:18
Cảm ơn, mã đã biên dịch làm cho nó rất rõ ràng. Làm thế nào để bạn làm điều đó với Resharper? –
Chỉ để tránh nhầm lẫn - đó là mã * resharper * được xây dựng lại từ IL. Đó là ** không ** mã trình biên dịch tạo ra. Trình biên dịch tạo ra IL, chứ không phải C#. –
Xin lỗi tôi không có nghĩa là Resharper - ý tôi là * Reflector * từ đây (http://www.red-gate.com/products/reflector/). Tôi đã chỉnh sửa để làm rõ –