2009-03-17 33 views
5

Tôi đã nghĩ về điều này trước đây và nó lại xuất hiện trong đầu khi đọc câu hỏi this.Có bất kỳ kế hoạch nào cho "thuộc tính mở rộng" trong phiên bản C# trong tương lai không?

Có bất kỳ kế hoạch nào cho "thuộc tính mở rộng" trong phiên bản C# trong tương lai không?

Dường như với tôi, chúng có thể khá ổn định để thực hiện thêm một chút "trình biên dịch ma thuật". Ví dụ, sử dụng get_set_ tiền tố vào tên phương pháp khuyến nông sẽ biến phương pháp đó vào một tài sản mở rộng:

public class Foo 
    { 
     public string Text { get; set; } 
    } 
    public static class FooExtensions 
    { 
     public static string get_Name(this Foo foo) 
     { 
      return foo.Text; 
     } 
     public static void set_Name(this Foo foo, string value) 
     { 
      foo.Text = value; 
     } 
    } 

Có bất kỳ hạn chế kỹ thuật mà sẽ ngăn chặn điều này? Điều này có tạo ra quá nhiều thứ xảy ra đằng sau hậu trường không? Không đủ quan trọng để có giá trị nỗ lực?

Trả lời

7

Trang web chính thức cho các yêu cầu tính năng là http://connect.microsoft.com/VisualStudio.

Đã có yêu cầu cho thuộc tính tiện ích mở rộng here.

của Microsoft câu trả lời trên 2008/07/29 bao gồm những điều sau đây:

thuộc tính mở rộng là một yêu cầu phổ biến, và chúng tôi thực sự đã khá xa với một thiết kế cho phiên bản tiếp theo của ngôn ngữ, nhưng cuối cùng đã phải cắt giảm vì nhiều sự cố khác nhau . Nó vẫn nằm trên radar của chúng tôi.

3

Mặc dù tôi không nghĩ những gì bạn đang đề xuất là một ý tưởng tốt, bạn có thể nhận được khá nhiều điều tương tự với loại sắp tới dynamic trong C# 4. Một phần của những gì được lên kế hoạch là cho phép các thuộc tính và phương pháp mới được thêm vào khi chạy theo các đối tượng và kiểu hiện có. Một khác biệt là bạn sẽ không có việc kiểm tra thời gian biên dịch thuộc tính mở rộng.

+0

Điều tương tự với cùng một nghĩa là 'động' và các loại thông thường đều giống nhau. Người Nga có một trò đùa khiêu dâm tốt về điều đó. –

6

Nói chung tôi nghĩ điều này sẽ khuyến khích thực hành kém. Các thuộc tính được cho là đại diện cho một số loại trạng thái về đối tượng được đề cập, trong khi các phương thức phải đại diện cho các đơn vị công việc. Nhưng nhiều nhà phát triển có xu hướng đặt mã tính toán chuyên sâu hoặc tương đối dài trong các getters và setters nơi chúng sẽ thích hợp hơn nhiều như các phương thức. Mở rộng một đối tượng là không phải là giống như đối tượng phát sinh từ nó. Nếu bạn cần thêm thuộc tính, từ quan điểm triết học bạn đang nói về việc cần thêm thông tin trạng thái vào đối tượng. Điều đó nên được thực hiện bằng cách bắt nguồn từ lớp.

+0

Thuộc tính mở rộng có thể đơn giản như một tên khác cho một số thuộc tính khác: "Tên" thay vì "Văn bản". Nó cũng có thể là một sự kết hợp của các thuộc tính khác: public static string get_FullName (tên này n) {return n.First + "" + n.Last; } –

+0

@J Daniel Smith trong khi nó có vẻ thuận tiện để làm cho rằng một tài sản, nó nên được GetFullName() bởi vì nó làm một cái gì đó chức năng. Có một sự phân biệt chính thức được dành riêng cho một lý do - nó loại bỏ bất kỳ cần phải dành thời gian tranh luận liệu "một số công việc" là "quá nhiều" cho một tài sản. –

+1

Hãy nói rằng tôi có một lớp niêm phong hiện tại cho thấy trạng thái của nó như là phương pháp (vì các lập trình viên ban đầu đến từ java. Sigh), và tôi muốn sử dụng các thuộc tính mở rộng để làm sạch nó ... Có gì sai? –

0

Tôi không chắc chắn cách thức hoạt động. Các phần mở rộng phải là tĩnh, vì vậy bản thân tài sản sẽ phải tĩnh. Các phương tiện bất cứ điều gì bạn sử dụng để quay trở lại các thuộc tính này cũng sẽ là tĩnh. Nhưng hy vọng kế hoạch sử dụng của bạn cho những dự kiến ​​này sẽ được liên kết với các trường hợp được chỉ ra bởi từ khóa this thay vì chính loại đó.

+0

Tại sao điều này lại bị bỏ phiếu? Bạn đưa ra một câu hỏi rất hay về trạng thái tĩnh của các phương thức/thuộc tính mở rộng (do đó +1). Tất nhiên, những gì mọi người có ý nghĩa là họ muốn đạt được cùng một hành vi như thừa kế cung cấp ** nhưng không có ** thực sự kế thừa. I E. giữ tên của lớp và chỉ cần giữ một tập tin trợ giúp trong một lib dùng để thêm một số phương thức và/hoặc các thuộc tính hữu ích. Vết thương là một điều tốt đẹp để có ... –

0

"Thuộc tính tiện ích mở rộng" hiện có sẵn thông qua kế thừa. Thêm một con thú như vậy sẽ khuyến khích thực hành oop nghèo và generaly gặp rắc rối nhiều hơn giá trị của nó.

+0

Vấn đề với điều này là nó là một sự lạm dụng thừa kế, và nó chỉ hoạt động nếu tôi có toàn quyền kiểm soát việc tạo ra các đối tượng. Bạn không thể ví dụ kế thừa từ system.string. –

+0

Bạn cũng không muốn. –

+0

Nó không có sẵn, C# không hỗ trợ đa thừa kế vì vậy nó thực sự khá dễ dàng va chạm vào các tình huống mà đơn giản là không thể có thiết kế rõ ràng do giới hạn này, nếu thực tế, tôi đã chạy trong cuộc sống thực vào ví dụ chính xác " chú bob "đề cập đến blog của anh ấy http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html và các thuộc tính mở rộng sẽ là giải pháp khả thi cho vấn đề được đề xuất –

2

Có thể có điều gì đó cần phải nói về loại mẹo đó.

Chỉ cần xem các thuộc tính được đính kèm trong WPF. Chúng tạo ra sức mạnh to lớn cho sự gắn bó hành vi khai báo.Nhưng tôi không chắc điều đó sẽ trông như thế nào bên ngoài ngữ cảnh khai báo ...

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