2009-12-09 40 views
5

Câu hỏi đơn giản: một thuộc tính trừu tượng có tạo trường sao lưu riêng tư không? Ví dụ:Thuộc tính trừu tượng có tạo trường sao lưu riêng tư không?

public abstract Name { get; set; } 

Điều này sẽ tạo trường sao lưu riêng tư? Tôi muốn ép buộc bất kỳ lớp nào bắt nguồn từ thuộc tính này để sử dụng trường sao lưu riêng của họ, không phải là trường được tạo bởi trình biên dịch.

Trả lời

7

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 đó.

+0

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? –

+0

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#. –

+0

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õ –

5

Không. Vì nó trừu tượng, trình triển khai lớp phải triển khai thuộc tính. Nếu người triển khai khai báo nó theo cách đó, thì Có, đó là thuộc tính tự động với một thành viên ẩn để giữ giá trị thực.

3

Có sự khác biệt giữa:

public abstract string Name { get; set; } 

public string Name { get; set; } 

Việc kê khai tài sản đầu tiên không tạo ra một lĩnh vực sao lưu. Nó chỉ tạo ra một thuộc tính trừu tượng (giống như một khai báo phương thức giao diện), mà nó phải được thực hiện bởi bất kỳ lớp kế thừa không trừu tượng nào.

Khai báo thứ hai là thuộc tính tự động, DOES tạo trường sao lưu. Nó thực sự là trình biên dịch viết tắt của cú pháp đường cho:

private string _name; 
public string Name { get { return _name; } set { _name = value; } } 
Các vấn đề liên quan