2010-04-13 75 views
10

Tôi đang xem xét mã của nhà phát triển khác và ông đã viết rất nhiều mã cho các biến cấp lớp đó là tương tự như sau:Có lợi ích gì khi khai báo một tài sản riêng với getter và setter không?

/// <summary> 
    /// how often to check for messages 
    /// </summary> 
    private int CheckForMessagesMilliSeconds { get; set; } 

    /// <summary> 
    /// application path 
    /// </summary> 
    private string AppPath { get; set; } 

Không mã hóa theo cách này thêm overhead không cần thiết vì biến là tư nhân?

Tôi không xem xét một tình huống mà mẫu mã hóa này được yêu cầu cho các biến riêng tư?

+0

Tôi thích sử dụng các trường riêng tư hơn là thuộc tính riêng tư, vì sự hiện diện của tiền tố _ trong mã của tôi nhắc tôi rằng tôi đang làm việc với một thành viên riêng tư. Nếu tôi muốn biến chúng thành các thuộc tính riêng sau này, tôi chỉ cho phép Resharper làm điều đó, vì tất cả các tham chiếu đều là cục bộ cho lớp đó. –

+0

bản sao có thể có của [Sự khác biệt giữa các trường cá nhân và thuộc tính cá nhân] (http://stackoverflow.com/questions/411048/differences-between-private-fields-and-private-properties) –

Trả lời

6

Thuộc tính riêng cung cấp cho bạn mức trừu tượng khi gán giá trị cho biến riêng tư (được tạo bởi trình biên dịch). Nó không kém hiệu quả để làm như vậy, và nếu bạn cần thay đổi cách phân công được thực hiện trong tương lai, bạn chỉ phải lo lắng về việc cập nhật nó ở một nơi.

Nó cũng có thể cung cấp sự nhất quán trong một ứng dụng. Nếu tất cả các bài tập được thực hiện thông qua các thuộc tính, thì một số bài tập có thể xác thực các giá trị gán trong khi những bài tập khác không. Đối với người giao tiếp với tài sản, không có sự khác biệt giữa những người xác nhận hợp lệ và những người không hợp pháp. (và theo cách này, một người nào đó không vô tình gán một giá trị cho một biến cục bộ không xác thực.)

+0

Hầu hết thời gian trình biên dịch JIT sẽ tối ưu hóa các cuộc gọi đến getter và setter đi, vì vậy tôi sẽ không lo lắng nhiều về hiệu quả. – Steven

1

IIRC, trình biên dịch sẽ tối ưu hóa quyền truy cập vào các thuộc tính và nó sẽ kết thúc trực tiếp tham chiếu đến tạo ra trường sao lưu.

Điều này sẽ dẫn đến không có mã trên cao, sạch hơn và dễ bảo trì hơn.

+2

Nó sẽ là trình biên dịch JIT, không phải trình biên dịch C#. –

9

Điều đó giống như nói rằng các phương thức riêng tư không có lợi vì chúng bổ sung thêm chi phí không cần thiết và không ai ở bên ngoài lớp sẽ sử dụng chúng.

Thuộc tính cung cấp cho bạn một điểm liên hệ giữa biến và phần còn lại của mã. Trong tương lai, bạn có thể muốn thêm lỗi kiểm tra hoặc cập nhật một số giá trị khác bất cứ khi nào biến thay đổi và thuộc tính sẽ cho phép bạn thực hiện điều đó.

+0

+1: Mẫu này có tên: ** trường tự gói gọn **. Nó có ý nghĩa khi thực thi các quy tắc hoặc bất biến liên kết với một lĩnh vực nếu không sẽ trở thành nhân đôi và lây lan ra ngoài. Có một bài viết tuyệt vời về nó ở đây: http://sourcemaking.com/refactoring/self-encapsulate-field – LBushkin

3

Không, trình biên dịch JIT sẽ chuyển đổi sở hữu truy cập vào biến trực tiếp truy cập trên các lĩnh vực ủng hộ, do đó, nó không kém phần hiệu quả hơn là sử dụng một biến thành viên trực tiếp.

Lợi thế là nếu bạn muốn chuyển đổi thuộc tính thành triển khai không cần thiết, bạn chỉ có thể thêm mã vào get/set để cho phép kiểm tra hoặc hành vi bổ sung hoặc cơ chế lưu trữ khác được sử dụng cho thuộc tính mà không cần để cấu trúc lại bất kỳ mã máy khách nào (trong trường hợp này, tất cả trong cùng một lớp).

3

Tôi có thể nói rằng thực hành tốt là thói quen sử dụng các thuộc tính thay vì các trường.
Chi phí trên có thể tối thiểu không tồn tại, vì JIT có thể đặt nội tuyến getter và setter. Vì vậy, trong khi không nhất thiết cần thiết, không có gì sai khi làm theo cách này.

0

Sự cố hiệu suất có thể không đáng kể hoặc không tồn tại, nhưng nó yêu cầu bạn nhập 9 ký tự (+ dấu cách) để không có.Nếu sau này bạn muốn chuyển đổi trường của bạn thành thuộc tính, bạn có thể làm điều đó vì trường và thuộc tính hoàn toàn tương thích với nguồn (miễn là bạn không sử dụng loại giá trị có thể thay đổi).

0

Tôi không thấy bất kỳ lợi ích thực sự nào cho điều này, mặc dù tôi cũng không thấy bất kỳ tác hại nào. Nếu bạn định chuyển đổi tài sản thành một công chúng trong tương lai, nó có thể giúp bạn tiết kiệm được một chút. Nhưng bạn có thường xuyên chuyển đổi các thành viên riêng thành các tài sản công cộng không? Và khi bạn làm, nó có lẽ chỉ là một hoặc hai mặt hàng trong số nhiều thành viên mà lớp của bạn chứa. Nếu bạn định chuyển sang triển khai không tầm thường hoặc thêm bất kỳ loại xác thực nào, bạn sẽ cần phải chuyển đổi thuộc tính tự động thực hiện thành một trường sao lưu thực, điều này phủ nhận mọi lợi ích đơn giản mà bạn có thể nghĩ rằng bạn đã đạt được khởi đầu.

Đối với tôi, điều đó dường như là một sở thích cá nhân, không có tác động về hiệu suất và một số tác động nhỏ (cả tích cực lẫn tiêu cực) khi thực hiện các thay đổi trong tương lai.

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