2010-05-25 31 views
10
  1. ai đó có thể giải thích cho tôi ý tưởng đằng sau việc sử dụng Thuộc tính được tự động triển khai là C#?Thuộc tính được triển khai tự động C#

    public class Customer 
    { 
        public int ID { get; set; } 
        public string Name { get; set; } 
    } 
    

    Tôi có động lực để sử dụng thuộc tính cho trường riêng tư, vì vậy chúng tôi có thể xác định cách người dùng có thể truy cập trường riêng tư. Nhưng ở đây - nó giống như xác định lĩnh vực được công khai từ nơi đầu tiên. Không?

  2. Có sự khác biệt nào giữa việc xác định trường là "const công khai" hay xác định trường để có thuộc tính chỉ nhận không?

+1

bản sao có thể có của [C#: điểm có một tài sản hoàn toàn công khai] là gì (http://stackoverflow.com/questions/2901591/c-what-is-the-point-in-having-a-purely -public-property) –

+0

Và http://stackoverflow.com/questions/1277572, http://stackoverflow.com/questions/1272521, http://stackoverflow.com/questions/1180860 và nhiều hơn nữa –

+0

có thể trùng lặp [Sự khác biệt giữa tài sản và trường trong C# 3.0+] (http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0) – nawfal

Trả lời

16

Thuộc tính tự động công khai không giống với trường công khai, chúng không tương thích nhị phân. Nếu bạn thực hiện một lĩnh vực công cộng và sau này muốn thêm một số logic, bạn sẽ phải thay đổi nó thành một thuộc tính và do đó giới thiệu một sự thay đổi phá vỡ (vì sự không tương thích nhị phân). Đây là lý do tại sao nhiều quy ước nói rằng bạn không bao giờ nên để lộ các trường công khai mà là sử dụng các thuộc tính. Vì vậy, các thuộc tính tự động chỉ là một điểm khởi đầu thuận tiện cho bất kỳ thành viên giá trị lớp không tư nhân đơn giản nào, cho phép một thêm logic sau này trong khi vẫn giữ khả năng tương thích nhị phân.

5

Thuộc tính có thể được dữ liệu, trong khi các trường không thể.

+0

Tôi nghĩ, đây là lý do thực sự duy nhất khiến họ bị phát minh ... – SergeyT

2

tôi sẽ cho MSDN làm nói ở đây ....

"Trong C# 3.0 và sau, thuộc tính tự động thực hiện làm cho tài sản kê khai chính xác hơn khi không có logic bổ sung là cần thiết trong accessors tài sản. Họ Khi bạn khai báo một thuộc tính như được hiển thị trong ví dụ sau (xem bài viết MSDN chẳng hạn), trình biên dịch tạo ra một trường riêng tư, ẩn danh sao lưu chỉ có thể được truy cập thông qua bộ nhận và thiết lập của thuộc tính "

Có lẽ là di chuyển thuận lợi nhất fference là bạn có thể làm trước/sau xác nhận, nâng cao PropertyChanged sự kiện vv

Có sự khác biệt giữa xác định trường là "public const" hay xác định nó để có thuộc tính chỉ nhận không?

Có, trường chỉ nhận phải có khai báo trường riêng. Trường này có thể được thay đổi bởi lớp bên trong, đánh dấu một trường là const nghĩa là không thể sửa đổi.

1

2: một const công khai phải được xác định tại compiletime, bạn không thể sử dụng các đối tượng tham chiếu cho điều đó. Chỉ có các lớp kế thừa từ System.ValueType (string, int, double, ...)

Một const cũng là tĩnh trong khi một tài sản với chỉ một getter không phải là (mỗi lớp có nó dụ riêng.)

0

Về 1: Sử dụng các thuộc tính tự động triển khai được khuyến nghị, bởi vì bạn có thể triển khai logic bổ sung sau này mà không cần phải thay đổi. Bạn có thể tìm thấy ví dụ về điều này tại Learning about Auto-Implemented Properties

3

Thuộc tính được tự động triển khai thực chất là cú pháp đường. Sau khi được biên dịch, cửa hàng sao lưu tồn tại. Nó không có sẵn từ mã nguồn.

Như những người khác đã nêu, thuộc tính và trường không tương đương. Các trường và thuộc tính không tương thích nên việc thay đổi giữa chúng là một thay đổi đột phá. Ngoài ra, bạn không thể sử dụng ràng buộc dữ liệu với các trường.

Điểm cuối cùng. Mặc dù trong trường hợp của bạn có ít sự khác biệt về chức năng giữa ví dụ và trường công khai, bạn có thể thay đổi chế độ hiển thị của một trong các trình truy cập. Vì vậy, để tạo ra một thuộc tính chỉ đọc sử dụng một tài sản tự động, bạn có thể làm điều gì đó như:

public int ID { get; private set; } 

Trong trường hợp này, get accessor là công khai, theo toàn bộ chữ ký, nhưng các thiết lập accessor là tư nhân.

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