2009-04-21 40 views
9

Tại sao điều này? Tôi sẽ tìm thấy nó thực sự tốt đẹp để có thể có một số phương pháp mở rộng bị khóa xuống để được sử dụng chỉ trong một trong các lớp học của tôi. Không thực sự muốn có phương pháp khuyến nông nào đó có sẵn ở khắp mọi nơi ... và họ trông rất đẹp hơn nhiều so với phương pháp tĩnh thường xuyên: PPhương pháp mở rộng không được phép trong các lớp tĩnh lồng nhau?


Để làm rõ:

Lý do tôi muốn những phương pháp khuyến nông là bởi vì Tôi đang mở rộng một Form, trong đó có một DataGridView trên đó. Và tôi nhận được rất mệt mỏi của dòng như thế này:

foreach(var row in grid.Rows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value)) 

foreach(var row in grid.SelectedRows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value)) 

có muốn một phương pháp mở rộng vì vậy mà tôi chỉ có thể làm

foreach(var row in grid.Rows.CheckedRows()) 

foreach(var row in grid.SelectedRows.CheckedRows()) 

Vì vậy, nói cách khác, phương pháp mở rộng này sẽ không có ích gì cả bên ngoài lớp học này. Nhưng nó sẽ làm cho mã sạch hơn rất nhiều. Tất nhiên có thể làm cho các phương pháp thường xuyên, và đó là những gì tôi đã làm, vì điều này là không thể.

Aaanyways, tôi chỉ tò mò muốn biết nếu có ai đó có một số lý lẽ tốt cho lý do tại sao họ đã chọn để đặt một hạn chế như thế này khi các phương pháp mở rộng có thể tạo ra được sử dụng. Phải ở trong một lớp tĩnh có ý nghĩa tổng thể. Không thể nằm trong lớp tĩnh lồng nhau không ... ít nhất là tôi ...

+0

Có vẻ như không có câu trả lời nào trong số các câu trả lời này đưa ra lý do kỹ thuật tốt tại sao không thể thực hiện được. –

+0

Giống như bạn, tôi thích cú pháp phương pháp mở rộng hơn. SomeThing.HasSomeCondition() vượt trội hơn HasSomeCondition (SomeThing). – Mir

Trả lời

1

Việc sử dụng phương pháp mở rộng có thực sự làm cho mã của bạn sạch hơn rất nhiều hơn là sử dụng phương pháp trợ giúp chuẩn trên lớp học của bạn không?

// extension method 
foreach (var row in grid.Rows.CheckedRows()) 
foreach (var row in grid.SelectedRows.CheckedRows()) 

// standard helper method 
foreach (var row in CheckedRows(grid.Rows)) 
foreach (var row in CheckedRows(grid.SelectedRows)) 
+1

có lẽ không. Tôi chỉ thích nó tốt hơn khi mọi thứ không lùi lại. loại. Mặc dù, có lẽ tôi chỉ cần điều chỉnh suy nghĩ của tôi từ "lưới -> hàng -> những người đã chọn" thành "những người được kiểm tra của lưới -> hàng" ... hmm ... nhưng tôi đoán loại này biến thành một chủ quan kiểu mã hóa kiểu điều bây giờ. Điểm tốt mặc dù! =) Sẽ chấp nhận nó như là một câu trả lời, trừ khi ai đó đi kèm với một số Microsoft liên quan "những suy nghĩ đằng sau này" loại điều. – Svish

+2

@Svish (cách sau): nó không phải (hoàn toàn) chủ quan: systax không mở rộng soạn thảo kém như là nguyên nhân làm tổ quá mức (nghĩa là khả năng đọc kém). cú pháp mở rộng là một dạng của trình đọc-tailcalls, nếu bạn sẽ :-) –

2

Nếu bạn đang mở rộng Loại, thì các phương pháp tiện ích mở rộng phải được truy cập bình đẳng như chính loại đó.

Thực tiễn tốt nhất cũng đề xuất đặt tất cả các phương thức mở rộng ở một nơi, tốt nhất là trong một lớp tĩnh hoặc chứa trong một không gian tên duy nhất.

+5

Đặt tất cả các phương pháp mở rộng ở một nơi là ý tưởng tồi khi đặt tất cả các phương thức tiện ích vào một nơi. –

+0

Nếu bạn đang mở rộng một loại, không có giai đoạn nào thì các phương thức mở rộng có thể truy cập được như loại chắc chắn? –

+3

Tôi có OP. Nó sẽ là tốt đẹp để giới hạn phạm vi của các phương pháp mở rộng của bạn. Đôi khi những gì bạn cần làm với loại chỉ áp dụng trong một kịch bản cụ thể nhưng bạn vẫn muốn tận dụng lợi thế của đường cú pháp của các phương pháp mở rộng. – xr280xr

4

Nếu bạn sở hữu mã nguồn của loại, tại sao bạn sử dụng các phương pháp mở rộng? Tại sao bạn không chỉ làm cho những thành viên mở rộng phương pháp của các loại chính nó?

Phương pháp mở rộng được sử dụng tốt nhất để mở rộng các loại mà bạn không tạo. Mặc dù chúng là những công cụ hữu ích nhưng chúng là một lớp của sự hướng dẫn mà nên là phương sách cuối cùng chứ không phải là lần đầu tiên. Mặc dù bạn có thể sử dụng chúng để mở rộng các loại của riêng mình nhưng điều này có ý nghĩa hơn khi đặt trước việc sử dụng chúng cho các loại mà bạn không tạo.

+0

Um, chắc chắn anh ta không tạo DataGridView ;-) –

+2

Xin chào Andrew. Không thể đồng ý với bạn về điều này. Trong một số trường hợp, việc trang trí các lớp hiện có với các chức năng bổ sung có ý nghĩa mà không làm cho nó có sẵn rộng rãi. Chúng ta có thể lấy được, có thể tạo ra một lớp trang trí hoặc đơn giản là sử dụng các phương thức mở rộng và trong một số trường hợp, các phương thức mở rộng giúp đỡ ở đây. Hãy Unity, LINQ chính nó và những người khác cho hành vi này. –

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