2012-02-06 15 views
9

Trong CLR via CSharp chương 10 "Properties" Jeff Richter viết:Tại sao Thuộc tính được thực thi chậm hơn so với Thực thi Phương thức hoặc Phương thức?

phương pháp

Một tài sản có thể mất nhiều thời gian để thực hiện; Quyền truy cập của người dùng luôn luôn hoàn tất ngay lập tức. Một lý do phổ biến để sử dụng các thuộc tính là thực hiện đồng bộ hóa chuỗi, có thể dừng luồng vĩnh viễn, và do đó, không nên sử dụng thuộc tính nếu yêu cầu đồng bộ hóa . Trong tình huống đó, một phương pháp được ưa thích. Ngoài ra, nếu lớp học của bạn có thể được truy cập từ xa (ví dụ, lớp học của bạn có nguồn gốc từ System.MarshalByRefObject), gọi phương thức thuộc tính sẽ rất chậm và do đó, phương pháp được ưu tiên hơn là thuộc tính . Theo tôi, các lớp bắt nguồn từ MarshalByRefObject không bao giờ nên sử dụng các thuộc tính.

Đây có phải là trường hợp ngay cả khi thuộc tính được xác định để chỉ trả về trường riêng tư không? Tại sao một phương thức Phương thức được ưu tiên đồng bộ hóa? và tại sao Phương thức Phương pháp được ưu tiên hơn trong trường hợp MarshalByRefObject?

Để làm rõ câu hỏi của tôi:
Jeff dường như đang đưa ra tuyên bố về chăn rằng Thuộc tính không được khuyến khích và các phương pháp thích hợp hơn trong 2 trường hợp đó. như Joe White đã chỉ ra, các thuộc tính có thể có mã tùy ý. Nhưng các phương thức có thể chạy cùng một mã tùy ý. Đó là phần tôi gặp khó khăn. Có thực sự lợi thế trong việc sử dụng các phương thức trên các thuộc tính (cho cùng một mã được sử dụng) để đồng bộ hóa hoặc marshaling, hay liệu anh ta chỉ có một vấn đề với quy ước ngôn ngữ?

Trả lời

9

Tôi nghĩ anh ấy đang nói rằng, vì thuộc tính có thể chạy bất kỳ mã tùy ý nào, mã gọi gọi không được giả định rằng nó sẽ kết thúc ngay lập tức.

Nếu tất cả thuộc tính đều trả về một trường, thì phần thân phương thức của nó thực sự sẽ được trình biên dịch JIT biên soạn và nó sẽ nhanh như truy cập trường. Vì vậy, nó không phải là tài sản bằng cách nào đó chậm hơn; đó là những hộp đen. Nếu bạn không biết cách một thuộc tính được triển khai, bạn không thể đưa ra các giả định về việc nó quay trở lại nhanh chóng.

(Điều đó cho biết, tạo thuộc tính chậm sẽ là vi phạm rõ ràng .NET Framework Design Guidelines, cụ thể là: "Sử dụng phương thức chứ không phải thuộc tính, [nếu] hoạt động chậm hơn so với trường sẽ là ".)

Đối với đề xuất của anh ấy về cách sử dụng các phương pháp thay thế, tôi không thể thực hiện bất kỳ ý nghĩa nào về điều đó. Các thuộc tính là các phương thức: phương thức getter là phương thức (thường có tên là get_PropertyName), và setter thuộc tính là phương thức (set_PropertyName) và mã đọc thuộc tính được biên dịch thành mã gọi phương thức get_PropertyName. Không có gì đặc biệt mà sẽ làm cho bất động sản chậm hơn một phương pháp.

+7

Điểm của Jeff là cuộc gọi phương thức "GetBlah" * liên lạc với người đọc * "điều này có thể chậm" và thuộc tính "Blah" giao tiếp "điều này gần như chắc chắn là nhanh". Vì vậy, nếu bạn sẽ làm cho một cái gì đó chậm, làm cho nó một phương pháp. Tôi không * hoàn toàn * đồng ý với lời khuyên này - ví dụ, tôi thường tạo ra các thuộc tính có các trường hợp xấu nhất * chậm nhất * nhưng có hiệu suất * phân bổ tuyệt vời *. Nhưng lời khuyên của Jeff chắc chắn là một điểm khởi đầu tốt; đi chệch khỏi nó một khi bạn biết những gì bạn đang làm. –

5

Tôi nghĩ rằng điểm là quyền truy cập thuộc tính trông giống như một truy cập trường, vì vậy mọi người không mong đợi bất cứ điều gì bất thường.

Nếu bạn có thuộc tính có thể mất nhiều thời gian, bạn nên viết lại nó thành một phương pháp. Nó sẽ không làm cho mã của bạn thực hiện tốt hơn, nhưng nó sẽ rõ ràng hơn rằng nó có thể mất một thời gian dài.

Theo như hiệu suất hoạt động, không có sự khác biệt giữa quyền truy cập thuộc tính và gọi phương thức.Trên thực tế, quyền truy cập thuộc tính chỉ là một cuộc gọi phương thức.

+0

cũng .. ông đã nói một cách rõ ràng "gọi phương thức thuộc tính sẽ rất chậm, và do đó, một phương thức được ưu tiên hơn cho một thuộc tính". vì vậy nó không chỉ là về sự xuất hiện .. ít nhất là theo Jeff .. –

+1

Gọi điện cho tài sản sẽ chậm, và mọi người không mong đợi tài sản sẽ được làm chậm. Gọi một phương pháp sẽ không kém, nhưng mọi người hy vọng rằng một số phương pháp chậm. – svick

3

Phương thức không nhanh hơn thuộc tính, nhưng phương pháp không được dự kiến ​​sẽ nhanh như thuộc tính. Vì vậy, phương pháp được ưa thích để làm cho rõ ràng rằng nó có thể mất một thời gian (vì đồng bộ hóa thread trong trường hợp này).

Các trường không được "thực hiện". Truy cập một trường là trực tiếp truy cập vào bộ nhớ.

+0

Truy cập một trường thể hiện là * gián tiếp * truy cập vào bộ nhớ, vì trước tiên bạn phải định vị bộ nhận * trong bộ nhớ. –

+0

@Eric: vâng, chắc chắn, tôi có nghĩa là bạn đang truy cập vào bộ nhớ, không thực thi mã. –