2010-04-08 24 views
27

Khi chúng ta định nghĩa một tài sản nhưTại sao tính được thực hiện tự động phải xác định cả get và set accessors

public string Name {get; set;} 

dot net có thể làm cho mã thuộc tính của chúng tôi. nhưng khi chúng tôi sử dụng

public string Name {get;} 
    public string Name {set;} 

chúng ta đối diện với

'Hajloo.SomeThing.PropertyName.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors. 

Thực ra lý do tại sao các trình biên dịch không thể xác định tài sản và làm cho mã tự động? Có chuyện gì vậy?

+3

Điều này hiện được hỗ trợ. http://kumarvikram.com/auto-property-enhancements-in-c-6/ – Onosa

Trả lời

55

Bởi vì thuộc tính được tự động triển khai tạo cửa hàng sao lưu riêng cho các giá trị thuộc tính. Bạn không có quyền truy cập vào cửa hàng nội bộ.

Thực hiện một tài sản với

  • chỉ nhận được: nghĩa là bạn chỉ có thể lấy các giá trị. Bạn không bao giờ có thể đặt giá trị thuộc tính (ngay cả trong lớp có chứa)
  • chỉ cần đặt: có nghĩa là bạn chỉ có thể đặt giá trị. Bạn không thể truy xuất giá trị thuộc tính.

cho một tài sản

private int _data; 
public int Data{ get { return _data } }; 

Ở đây, tầng lớp phụ huynh có thể làm như sau ở một nơi khác trong lớp (mà nó không thể với đạo cụ tự động)

_data = 100;

Note bình thường : Bạn có thể xác định một auto-prop như thế này (đó là cách tôi sử dụng nó nhiều nhất).

public int Data { get; private set;} 

Điều này có nghĩa là khách hàng bên ngoài không thể đặt thuộc tính. Tuy nhiên, chính lớp chứa có thể thiết lập thuộc tính nhiều lần qua this.Data = x; trong định nghĩa lớp.

+2

Cũng có thể đáng nói đến "bộ tư nhân" như một giải pháp nền tảng trung gian (và nó có thể là những gì OP thực sự đang tìm kiếm " –

+0

@Damien: Đó là ăn tôi quá ... lười biếng sửa chữa. – Gishu

5

Nếu không có setter, tài sản không bao giờ có bất cứ điều gì khác hơn là giá trị mặc định, do đó, không phục vụ bất kỳ mục đích nào.

+1

Bạn có thể yêu cầu tài sản trả lại bộ sưu tập. Bằng cách loại bỏ setter bạn sẽ không thể thay đổi loại của nó, nhưng bạn vẫn có thể thêm các mục vào bộ sưu tập. – Gorgsenegger

+1

@Gorgsenegger - nhưng điểm là nếu không có setter, tài sản sẽ luôn luôn có giá trị mặc định của nó - null trong trường hợp của một loại tham chiếu như một bộ sưu tập. Trong tình huống này, không có bộ sưu tập nào có thể được thêm vào. – Joe

+0

Vâng, đó là sự thật. Tôi đã mang đi, suy nghĩ về một tài sản với một setter tư nhân mà sau đó có thể được thiết lập từ ví dụ.bên trong constructor, nhưng bạn nói đúng, không có bất kỳ setter nào cả tôi dường như không có ý nghĩa gì nhiều :-) – Gorgsenegger

0

Một trường hợp hiện đại hơn để nhận lỗi này đang cố gắng xây dựng một dự án mà tác giả gốc đã biên soạn với VS2015 + và bạn đang sử dụng và phiên bản cũ hơn.

VS 2015 sử dụng MSBuild giải thích C# 6.0. Trong C# 6.0, bạn có thể có các tính năng tự động không có setter (chúng được giả định là một bộ riêng).

Thử biên dịch với VS2015 + hoặc msbuild 14+

Các vấn đề liên quan