2008-09-26 19 views
17

Tôi muốn điều này cho giao diện thông thạo. Xem, ví dụ: this Thảo luận về kênh9. Có lẽ require cũng thêm các thuộc tính được lập chỉ mục.Thuộc tính mở rộng có nên được thêm vào C# 4.0 không?

Suy nghĩ của bạn là gì? Những lợi thế có lớn hơn "sự lộn xộn ngôn ngữ" không?

+3

Tìm thấy bài đăng trên blog thú vị này của Eric Lippert về chủ đề http://blogs.msdn.com/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx – Jon

+0

Đừng để liên kết đó đến với các nhà truyền giáo nhanh nhẹn, họ sẽ ROTFLOL theo phong cách Weird Al tốt nhất. Bạn đặt một tấn công việc trong một tính năng và chỉ sau khi gần như hoàn thành, bạn nhận được phản hồi từ người tiêu dùng chính, hãy đoán xem điều gì đã xảy ra? –

Trả lời

6

Trong sách của tôi, lý do quan trọng nhất cho các thuộc tính mở rộng số 1 là triển khai các mẫu giao diện thông thạo xung quanh mã không được công nhận. Tôi đã xây dựng một wrapper xung quanh phiên NHibernate để làm cho nó intitutive hơn để làm việc với để tôi có thể làm luận tương tự như

public bool IsInTransaction 
{ 
    get { return _session.Is().Not.Null && _session.Is().InTransaction; } 
} 

nào trông rất ngu ngốc đó là phải có một phương pháp như không có cách nào cho tôi để chèn Là một thuộc tính trừ khi tôi trực tiếp sửa đổi nguồn trên đối tượng phiên.

29

Vì thuộc tính chỉ là cú pháp cú pháp cho các phương pháp, tôi không thấy lý do tại sao C# nên có phương thức mở rộng không có thuộc tính mở rộng.

3

Tôi không biết tại sao không. Các thuộc tính chỉ là các phương thức getter/setter với cú pháp khác.

1

Tôi đoán nó sẽ là tuyệt vời, miễn là không có hoặc tối thiểu hiệu suất phạt trong việc sử dụng chúng.

0

Chắc chắn sẽ thêm vào tiết mục của các công cụ theo ý của chúng tôi.

Bây giờ theo ý kiến ​​của tôi, có họ nên, nhưng cũng giống như bất cứ điều gì, các nhà phát triển cần phải sử dụng nó đúng cách và khi cần thiết. Giống như hầu hết các tính năng mới, rất nhiều dev sử dụng chúng mà không hoàn toàn hiểu chúng và khi nào/như thế nào/ở đâu/cách tốt nhất để sử dụng chúng. Tôi biết tôi bị hút vào điều này đôi khi quá.

Nhưng ya, chắc chắn, hãy bật nó lên. Tôi có thể thấy bản thân mình sử dụng nó trong một số trường hợp nhất định

0

Tôi đoán các thuộc tính được lập chỉ mục sẽ là một công cụ lưu trữ duy nhất trong số lượng lớn các cải tiến đáng kể mà chúng ta sẽ thấy trong 4.0.

2

Tôi không nghĩ rằng thuộc tính tiện ích sẽ gần như hữu ích. Tôi thấy bản thân mình chủ yếu sử dụng tài sản để đóng gói các lĩnh vực (cổ điển có được; bộ;) hoặc để cung cấp chỉ đọc tốt lành (chỉ cần có được trên một trường tư nhân, chỉ đọc, contructor-set). Vì các tiện ích mở rộng không thể truy cập các thành viên riêng tư, tôi không thực sự thấy điểm, đặc biệt là đối với "set;". Để làm bất cứ điều gì, "thiết lập;" sẽ chỉ phải gọi các phương thức khác. Sau đó, bạn chạy vào vấn đề thuộc tính ném ngoại lệ.
Vì các phần mở rộng được giới hạn trong việc sử dụng các thuộc tính và phương thức công khai, tôi thấy nó dễ đọc và dễ đọc hơn khi sử dụng một lớp tiện ích. Khi nó đi xuống đến nó, chúng tôi đang sử dụng các phương pháp mở rộng để làm cho LINQ trông khá. Để giữ cho các nhà phát triển không làm điều sai trái, tôi có thể xử lý thêm() ở đây và ở đó trong LINQ của tôi và chỉ dính vào các phương thức mở rộng.

+0

Vấn đề là không xử lý thêm(), cùng một điểm với bất kỳ đường cú pháp khác – alpav

-3

Không, thuộc tính chỉ là cách ẩn nội dung thực sự được tạo cho mã. Nếu bạn nhìn vào mã phản ánh hoặc IL bạn có thể xác định những gì bạn đang thực sự nhận được và nó là như sau:

public string MyProperty { get; set; } 

trở thành

public string get_MyProperty(){ return <some generated variable>; } 
public string set_MyProperty(string value) { <some generated variable> = value; } 

Nó chỉ là 2 phương pháp.

+0

Bạn không thể databind để get_MyProperty() – recursive

+0

Tôi không hiểu câu trả lời này - bạn ngụ ý bạn không phải là người bênh vực cho tính chất thông thường? –

+0

không, tôi chỉ chỉ ra rằng khái niệm về một tài sản là một khái niệm IDE, IL không hỗ trợ một cái gì đó trông giống như một tài sản. Bạn có thể đạt được cùng chức năng với get_MyProperty (đối tượng này o) {...}. Chắc chắn nó không phải là đường cú pháp tương tự mà chúng ta đang sử dụng nhưng đó là cùng một kết quả tổng thể. –

1

Dường như nó có thể dễ dàng bị lạm dụng. Như những người khác đã đề cập, C# tài sản chỉ là cú pháp đường cho phương pháp. Tuy nhiên, việc triển khai thực hiện những thuộc tính đó có ý nghĩa nhất định: truy cập sẽ không có tác dụng phụ và sửa đổi một thuộc tính nên rất rẻ. Điểm thứ hai là rất quan trọng vì có vẻ như các thuộc tính mở rộng sẽ hầu như luôn đắt hơn các thuộc tính thông thường.

9

Đó là về databinding, giả sử tôi có một đối tượng để ràng buộc với giao diện người dùng của mình và tôi muốn ẩn hiển thị nó dựa trên các thuộc tính khác của đối tượng. Tôi có thể thêm một thuộc tính mở rộng cho IsVisible hoặc Visibility và liên kết thuộc tính đó với UI.

Bạn không thể ràng buộc các phương pháp mở rộng, nhưng việc có thể thêm thuộc tính để dữ liệu vào các kiểu hiện có mà bạn không thể mở rộng có thể rất hữu ích.

+0

Có, tôi cần nó cho databinding cũng !!!! – tbone

+1

Điều này sẽ không hoạt động: ràng buộc dữ liệu sử dụng sự phản chiếu trên loại đối tượng bị ràng buộc để lấy các thuộc tính. Thuộc tính mở rộng sẽ tồn tại theo kiểu thứ hai tùy ý mà khung ràng buộc sẽ không có kiến ​​thức về. Các phương thức mở rộng (và các thuộc tính, nếu chúng tồn tại) là một tính năng biên dịch thời gian mà không có khả năng phát hiện thời gian chạy. –

+1

Có những lựa chọn thay thế cho điều này (tôi biết tôi trễ để trả lời, nhưng chỉ thấy câu trả lời này), bằng cách sử dụng các bộ sưu tập thực hiện một số giao diện liên quan đến databinding, bạn có thể có bộ sưu tập thêm các thuộc tính có thể ràng buộc. Nói cách khác, bằng cách đưa ra công thức cho cách tính thuộc tính IsVisible cho bộ sưu tập, bạn có thể liên kết với nó trong một lưới hoặc tương tự. Tất nhiên, nếu bạn muốn liên kết với nó từ một hộp văn bản hoặc tương tự, có thể bạn sẽ không may mắn. –

0

Nhà phát triển nên sử dụng các thuộc tính để tổ chức phân cấp tên và tránh ghép nối tên với vỏ lạc đà hoặc dấu gạch dưới. Ví dụ, thay vì HttpUtility.UrlDecode họ nên mở rộng chuỗi lớp để sử dụng một cái gì đó như "một số str" .decode.url Hiện tại cách duy nhất để làm điều đó trong C# là: "some str" .decode(). Url

1

Sẽ là một điều tốt đẹp để có, nhưng tôi thấy nhiều người nói rằng họ muốn nó cho ràng buộc dữ liệu mà không thể vì nó sử dụng sự phản chiếu.

0

Có, vui lòng.

Và cũng có thể thêm các thuộc tính được lập chỉ mục và các công cụ mở rộng STATIC, vì tôi rất muốn nó cho System.Console (điều này không có nghĩa là một trò đùa!).

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