2009-03-26 43 views
32

Vì vậy, đây là một chút cú pháp mà tôi chưa bao giờ thấy trước đây, ai đó có thể cho tôi biết điều này có nghĩa là gì? Bạn không chắc chắn nếu điều này được cho là viết tắt của một tuyên bố tài sản trừu tượng hoặc một cái gì đó hoặc những gì.C# Viết tắt Câu hỏi bất động sản

public Class1 myVar { get; set; } 

Đối với giá trị của nó, Class1 là lớp trừu tượng.

Trả lời

82

Trong C# 3.0 và sau đó, auto-implemented properties làm cho khai báo tài sản ngắn gọn hơn khi không có logic bổ sung là bắt buộc trong các trình truy cập thuộc tính. Chúng cũng cho phép mã máy khách tạo các đối tượng Khi bạn khai báo một thuộc tính như trong ví dụ sau, trình biên dịch tạo ra một trường sao lưu riêng, ẩn danh chỉ có thể truy cập thông qua các trình truy cập nhận và đặt của thuộc tính.

// Auto-Impl Properties for trivial get and set 
    public double TotalPurchases { get; set; } 
    public string Name { get; set; } 
    public int CustomerID { get; set; } 
+1

Tôi sẽ bỏ phiếu cho bạn để có được một lời giải thích kỹ lưỡng hơn nhưng tôi tất cả ra cho ngày. – TheTXI

0

Getters và setters tự động.

7

Nó được gọi là thuộc tính tự động hoặc auto-implemented và không trừu tượng. Bạn có thể sử dụng thuộc tính đó như hiện tại. Trình biên dịch sẽ tạo ra một cửa hàng sao lưu cho nó đằng sau hậu trường.

Nó rất giống như chỉ sử dụng một trường thay vì thuộc tính, nhưng bạn có ngữ nghĩa thuộc tính và bạn có thể sử dụng nó cho những thứ như databinding yêu cầu thuộc tính.

+0

Và sau đó bạn có thể thay đổi thành triển khai rõ ràng mà không thay đổi giao diện của bạn cho người gọi. –

27

Đây là cú pháp để cho trình biên dịch tạo trường ẩn (ẩn) cho bạn.

Cũng rất hữu ích là:

public Class1 myVar{ get; private set; } 
+0

'protected' cũng hoạt động. Giống như 'riêng tư '. Tôi khá chắc chắn bạn có thể thiết lập khả năng truy cập cho 'get', quá, nhưng tôi chưa bao giờ thử. –

+1

+1 điều này chính xác với những gì tôi đang tìm kiếm. Tôi muốn một cái gì đó để bao gồm trong viết tắt vì vậy 'set' hoạt động có thể được thực hiện chỉ bởi các chức năng thành viên lớp học. Cảm ơn :-) – shashwat

7

Nó là viết tắt cho một tài sản mà không làm gì hơn là lưu trữ các giá trị trong một lĩnh vực. Vì vậy, nó sẽ tương đương với:

private Class1 _myVar; 

public Class1 myVar 
{ 
    get{ return _myVar; } 
    set{ _myVar = value;} 
} 

Đây chỉ là một tài sản đơn giản mà hàng năm có thể thay thế bằng một sự giải thích phức tạp hơn mà không thay đổi giao diện.

2

Đây là các thuộc tính được Tự động triển khai. Chúng cho phép bạn mã hóa ngắn gọn hơn. Bạn có thể đọc thêm về họ ở đây:

Auto-Implement

Bạn cũng có thể làm cho các bộ truy xuất có mức độ truy cập khác nhau:

public int myVar {get; bộ tư nhân; }

Điều này cho phép bạn hiển thị thuộc tính bên ngoài lớp và vẫn đặt nội bộ trong lớp.

22

Nó có thể trông giống như thuộc tính trừu tượng hoặc thuộc tính từ giao diện nhưng nó cách xa nó. Để khuyến khích các nhà phát triển sử dụng các thuộc tính (vì chúng là một thực hành tốt nhất vì nhiều lý do), Microsoft đã quyết định đưa tính năng này vào C# 3 để cho phép bạn khai báo các thuộc tính dễ dàng hơn.

Dưới đây là cách tiêu chuẩn của việc tạo ra một tài sản:

String foo; 

public String Foo 
{ 
    get { return this.foo } 
    set { this.foo = value; } 
} 

Bây giờ điều này đòi hỏi khá nhiều đánh máy và như các nhà phát triển lười lõi đôi khi chúng ta bị cám dỗ để tạo ra các lĩnh vực công cộng chỉ để tiết kiệm thời gian .

Bây giờ với C# 3 trình biên dịch chúng ta có thể làm điều này:

public String Foo { get; set; } 

Trong khi điều này có vẻ hơi lạ, hãy xem xét những công việc mà các trình biên dịch đang làm thay cho bạn. Mã trước đó được biên dịch thành:

[CompilerGenerated]  
private string <Foo>k__BackingField; 

public string Foo 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Foo>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Foo>k__BackingField = value; 
    } 
} 

Vì vậy, mặc dù cú pháp có vẻ lạ một chút, bạn vẫn đang tạo thuộc tính chính xác theo cách bạn thường làm.