2008-10-03 30 views
24

Có ai thấy người làm điều này:biến công vs biến riêng với accessors

private string _name; 
public string Name{ get{ return _name; } set{ _name = value;}}

tôi hiểu sử dụng accessors nếu bạn đang thực hiện một số loại kiểm soát như thế nào nó được thiết lập hoặc thực hiện một số loại chức năng trên đó khi có được. Nhưng nếu bạn chỉ cần làm điều này, tại sao không chỉ làm cho biến công khai bắt đầu? Tui bỏ lỡ điều gì vậy?

Trả lời

35

Nếu bạn đặt thành viên là trường công cộng, sau đó bạn không thể tái cấu trúc nó thành thuộc tính mà không thay đổi giao diện cho lớp học của bạn. Nếu bạn phơi bày nó như là một thuộc tính ngay từ đầu, bạn có thể thực hiện bất kỳ thay đổi nào đối với các hàm truy cập thuộc tính mà bạn cần và giao diện của lớp vẫn không thay đổi.

Lưu ý rằng kể từ C# 3.0, bạn có thể triển khai thuộc tính mà không tạo trường sao lưu, ví dụ::

public string Name { get; set; } 

Điều này loại bỏ lý do chính đáng để không triển khai trường công khai dưới dạng thuộc tính ngay từ đầu.

+2

Chỉnh sửa nhẹ (mặc dù tôi đồng ý với lực đẩy chung!) - các thuộc tính được tự động triển khai là một phần của C# 3.0, chứ không phải .NET 3.0. Điều đáng nói là sự khác biệt giữa ngôn ngữ và khung công tác. –

+1

Vâng. Là một người dùng VB.net, tôi rất buồn vì chúng tôi không nhận được những món quà như thế này. –

+2

Tôi biết đây là một chủ đề cũ, nhưng tôi muốn thêm điều này cho người dùng đến từ các công cụ tìm kiếm (như tôi): Kể từ .NET 4.0, VB.NET cũng hỗ trợ các thuộc tính tự động triển khai: http: // msdn.microsoft.com/en-us/library/dd293589.aspx – Nullius

0

Chuẩn bị. Bạn không bao giờ biết khi nào bạn sẽ muốn xóa người truy cập đã đặt xuống đường, thực hiện các thao tác bổ sung trong trình thiết lập hoặc thay đổi nguồn dữ liệu cho lệnh nhận.

0

Thành viên có thể truy cập công khai thường là phương pháp chứ không phải là trường. Nó chỉ là thực hành tốt, và thực hành đó giúp bạn đảm bảo rằng trạng thái đóng gói của các đối tượng của bạn luôn nằm dưới sự kiểm soát của bạn.

6

Ý tưởng là nếu bạn sử dụng người truy cập, việc triển khai cơ bản có thể được thay đổi mà không thay đổi API. Ví dụ: nếu bạn quyết định rằng khi bạn đặt tên, bạn cũng cần phải cập nhật một hộp văn bản hoặc một biến khác, không có mã khách hàng nào của bạn sẽ phải thay đổi.

13

Nếu bạn định nghĩa một giao diện công cộng với một tài sản trong lắp ráp A, sau đó bạn có thể sử dụng giao diện này trong lắp ráp B.

Bây giờ, bạn có thể thay đổi thực hiện của tài sản (có thể lấy giá trị từ một cơ sở dữ liệu thay vì lưu trữ nó trong một lĩnh vực). Sau đó, bạn có thể biên dịch lại assembly A, và thay thế một assembly cũ hơn. Hội B sẽ thực hiện tốt vì giao diện sẽ không thay đổi.

Tuy nhiên, nếu ban đầu bạn bắt đầu với trường công cộng và quyết định điều này không phù hợp và muốn thay đổi triển khai và thực hiện điều đó, bạn cần chuyển đổi nó thành thuộc tính thì điều này có nghĩa là bạn ' d phải thay đổi giao diện công khai của assembly A. Bất kỳ máy khách nào của giao diện đó (bao gồm cả assembly B) cũng sẽ phải được biên dịch lại và thay thế để có thể làm việc với giao diện mới này.

Vì vậy, bạn nên bắt đầu với một sản phẩm ngay từ đầu. Điều này gói gọn việc thực hiện thuộc tính, để bạn tự do thay đổi nó trong tương lai mà không phải lo lắng những gì khách hàng (bao gồm cả assembly B) đã được đưa ra trên thế giới bằng cách sử dụng assembly A. Bởi vì, nếu có bất kỳ khách hàng nào trên thế giới sử dụng assembly A, việc thay đổi giao diện sẽ phá vỡ tất cả các máy khách. Nếu chúng được sử dụng bởi một nhóm khác trong công ty của bạn, hoặc một công ty khác, thì họ sẽ không vui nếu bạn phá vỡ hội đồng của họ bằng cách thay đổi giao diện của bạn!

3

Thực hành lập trình tốt. Đây là một mô hình rất phổ biến phù hợp với phương pháp thiết kế OO. Bằng cách hiển thị trường công khai, bạn sẽ hiển thị nội bộ của dữ liệu đang được lưu trữ như thế nào. Sử dụng thuộc tính công khai thay vào đó cho phép bạn linh hoạt hơn để thay đổi cách dữ liệu được lưu trữ nội bộ và không phá vỡ giao diện công khai. Nó cũng cho phép bạn kiểm soát nhiều hơn những gì xảy ra khi dữ liệu được truy cập (khởi tạo lười, kiểm tra null, vv)

2

Biến là một phần của việc triển khai lớp học. Các thuộc tính biểu diễn một cách logic hơn giao diện cho nó. Với C# 3.0, các thuộc tính được tự động thực hiện làm cho việc này trở nên dễ dàng ngay từ đầu.

Tôi đã viết nhiều suy nghĩ về điều này, bao gồm các cách khác nhau trong đó thay đổi từ biến thành thuộc tính không chỉ tương thích nhị phân mà còn tương thích nguồn, trong an article on the topic.

0

Để duy trì mức độ mở rộng cao mà không bị đau khi biên dịch lại tất cả các hội đồng của bạn, bạn muốn sử dụng các thuộc tính công khai làm người truy cập. Bằng cách làm theo một "hợp đồng" hoặc một cơ chế được định nghĩa mô tả cách thức các đối tượng của bạn trao đổi dữ liệu, một tập hợp các quy tắc sẽ được đưa ra. Hợp đồng này được thực thi với một giao diện và được thực hiện bởi các getters và setters của lớp của bạn mà kế thừa giao diện này. Sau đó, bạn nên tạo thêm các lớp từ giao diện đó, bạn có linh hoạt tuân thủ hợp đồng với việc sử dụng các thuộc tính, nhưng vì bạn đang cung cấp dữ liệu thông qua các getters và setters, việc thực hiện hoặc quá trình lắp ráp dữ liệu có thể bất cứ điều gì bạn muốn, cùng với nó trả về loại mà "hợp đồng" mong đợi.

6

Có thể đáng chú ý là DataBinding trong .NET cũng từ chối làm việc với các trường công cộng và yêu cầu các thuộc tính. Vì vậy, đó có thể là một lý do khác.