2009-09-03 27 views
42

Đây có lẽ là vấn đề sở thích cá nhân, nhưng khi nào bạn sử dụng thuộc tính thay vì chức năng trong mã của bạnKhi nào thì sử dụng tài sản thay vì chức năng

Ví dụ để có được một bản ghi lỗi tôi có thể nói

string GetErrorLog() 
{ 
     return m_ErrorLog; 
} 

hoặc tôi có thể

string ErrorLog 
{ 
    get { return m_ErrorLog; } 
} 

Bạn quyết định sử dụng loại nào? Tôi có vẻ không nhất quán trong việc sử dụng của tôi và tôi đang tìm kiếm một quy tắc chung chung của ngón tay cái. Cảm ơn.

+0

trùng lặp với ít nhất 3 câu trả lời trong http://stackoverflow.com/search?q=c%23+properties. –

Trả lời

68

tôi có xu hướng sử dụng các thuộc tính nếu sau là đúng:

  • Khách sạn sẽ trả về một giá trị luận lý đơn
  • Ít hoặc không có logic có liên quan (thường chỉ trả về một giá trị, hoặc làm một nhỏ kiểm tra/khứ hồi giá trị)

tôi có xu hướng sử dụng các phương pháp nếu sau là đúng:

  • There i s sẽ là công việc quan trọng liên quan đến việc trả về giá trị - tức là: nó sẽ được lấy từ một DB, hoặc cái gì đó có thể mất "thời gian"
  • Có khá nhiều logic liên quan, hoặc trong việc nhận hoặc thiết lập giá trị

Bên cạnh đó, tôi muốn khuyên bạn nên nhìn vào Microsoft's Design Guidelines for Property Usage. Chúng đề xuất:

Sử dụng thuộc tính khi thành viên là thành viên dữ liệu lôgic.

Sử dụng một phương pháp khi:

  • Các hoạt động là một chuyển đổi, chẳng hạn như Object.ToString.
  • Hoạt động này đủ tốn kém mà bạn muốn liên lạc với người dùng rằng họ nên xem xét lưu vào bộ nhớ cache kết quả.
  • Lấy giá trị thuộc tính bằng cách sử dụng trình truy cập nhận được sẽ có tác dụng phụ quan sát được.
  • Gọi thành viên hai lần liên tiếp tạo ra các kết quả khác nhau.
  • Thứ tự thực hiện là quan trọng. Lưu ý rằng các thuộc tính của một loại sẽ có thể được đặt và truy xuất theo bất kỳ thứ tự nào.
  • Thành viên tĩnh nhưng trả về một giá trị có thể thay đổi.
  • Thành viên trả về một mảng. Các thuộc tính trả về mảng có thể rất gây hiểu nhầm. Thông thường nó là cần thiết để trả về một bản sao của mảng nội bộ để người dùng không thể thay đổi trạng thái nội bộ. Điều này, cùng với thực tế là người dùng có thể dễ dàng giả định nó là một thuộc tính được lập chỉ mục, dẫn đến mã không hiệu quả. Trong ví dụ mã sau, mỗi cuộc gọi đến thuộc tính Phương thức tạo bản sao của mảng. Kết quả là, 2n + 1 bản sao của mảng sẽ được tạo trong vòng lặp sau.
+2

Tôi muốn thêm rằng phương pháp của bạn chỉ nên có một trách nhiệm. Đừng tạo ra các phương thức khổng lồ mà các đoạn mã này làm những việc khác nhau. Chia từng công việc khác nhau thành các phương thức riêng hoặc thậm chí trong các phương thức trong một lớp học khác – skyfoot

+0

Zoooom !! Trả lời và nhận được 12 upvotes trong 5 phút. – AnthonyWJones

+0

@AnthonyWJones: Đó luôn luôn là một bất ngờ tốt đẹp khi nó xảy ra :) –

12

Dưới đây là hướng dẫn của Microsoft:

Choosing Between Properties and Methods

  • Xem xét sử dụng một tài sản nếu các thành viên đại diện cho một thuộc tính logic của các loại.

  • Sử dụng thuộc tính, thay vì phương pháp, nếu giá trị của thuộc tính được lưu trữ trong bộ nhớ quá trình và thuộc tính sẽ chỉ cung cấp quyền truy cập vào giá trị.

  • Không sử dụng phương pháp, thay vì thuộc tính, trong các trường hợp sau.

    • Thao tác là đơn đặt hàng có cường độ chậm hơn so với tập hợp trường sẽ là. Nếu bạn thậm chí đang xem xét việc cung cấp một phiên bản không đồng bộ của một hoạt động để tránh việc chặn luồng, rất có khả năng hoạt động đó quá đắt để trở thành tài sản. Đặc biệt, các hoạt động truy cập vào mạng hoặc hệ thống tệp (không phải một lần để khởi tạo) có thể là các phương thức, không phải là các thuộc tính.

    • Thao tác là một chuyển đổi, chẳng hạn như phương pháp Object.ToString.

    • Thao tác trả về kết quả khác mỗi lần được gọi, ngay cả khi các tham số không thay đổi. Ví dụ, phương thức NewGuid trả về một giá trị khác nhau mỗi khi nó được gọi.

    • Thao tác có tác dụng phụ đáng kể và quan sát được. Lưu ý rằng populating một bộ nhớ cache nội bộ thường không được coi là một tác dụng phụ quan sát được.

    • Thao tác trả về bản sao trạng thái nội bộ (không bao gồm bản sao của các đối tượng loại giá trị được trả về trên ngăn xếp).

    • Thao tác trả về một mảng.

2

tôi chưa bao giờ sử dụng một tài sản nếu tôi có thể ảnh hưởng nhiều hơn một lĩnh vực - Tôi luôn luôn muốn sử dụng một phương pháp.

Nói chung, tôi chỉ sử dụng lỗi công khai ErrorLog {get; bộ tư nhân; } cú pháp cho Thuộc tính và sử dụng Phương thức cho mọi thứ khác.

2

Ngoài câu trả lời của Reed khi tài sản chỉ trở thành người bắt đầu như kiếm tài nguyên như Nhật ký sự kiện. Tôi cố gắng và chỉ sử dụng tài sản khi tài sản sẽ có tác dụng phụ miễn phí.

2

Nếu có nhiều thứ không đáng kể xảy ra trong một thuộc tính thì đó phải là phương pháp. Ví dụ, nếu thuộc tính getter ErrorLog của bạn thực sự đi và đọc các tệp, thì nó phải là một phương thức. Việc truy cập một thuộc tính phải nhanh và nếu nó đang xử lý nhiều, nó phải là một phương thức. Nếu có những tác động phụ của việc truy cập vào một thuộc tính mà người dùng của lớp có thể không mong đợi, thì có lẽ nó sẽ là một phương thức.

.NET Framework Design Guidelines cuốn sách bao gồm loại nội dung này rất chi tiết.

4

Tôi sử dụng các thuộc tính khi rõ ràng ngữ nghĩa là "Lấy somevalue từ đối tượng". Tuy nhiên sử dụng một phương pháp là một cách tốt để giao tiếp "điều này có thể mất nhiều hơn một chút so với một nỗ lực tầm thường để trở lại".

Ví dụ: bộ sưu tập có thể có thuộc tính Count. Nó hợp lý để giả định một đối tượng thu thập biết bao nhiêu mục hiện đang được tổ chức mà không thực sự phải lặp qua chúng và đếm chúng.

Mặt khác, bộ sưu tập giả thuyết này có thể có phương thức GetSum() trả về tổng số bộ mục được giữ. Bộ sưu tập chỉ là một cách dễ dàng có một tài sản Sum thay vì bằng cách sử dụng một phương pháp nó truyền đạt ý tưởng rằng bộ sưu tập sẽ phải làm một số công việc thực tế để có được một câu trả lời.

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