2009-04-21 9 views
9

Perché è questo? Lo troverei davvero bello poter avere alcuni metodi di estensione bloccati per essere utilizzati solo all'interno di una delle mie classi. Non vuole veramente avere certi metodi di estensione disponibili in tutto il mondo ... e sembrano quindi molto di più rispetto ai metodi statici regolari: PI metodi di estensione non sono consentiti nelle classi statiche nidificate?


Per chiarimenti:

Il motivo che voglio questi metodi di estensione è perché Sto estendendo un modulo, che ha un DataGridView su di esso. E io sono sempre molto stanco di linee come questi:

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)) 

si augura un metodo di estensione in modo che ho potuto solo fare

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

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

Quindi, in altre parole, questo metodo di estensione non sarebbe utile a tutti fuori da questa classe. Ma renderebbe il codice molto più pulito. Ovviamente è possibile anche fare dei metodi regolari, ed è quello che ho finito, dato che non era possibile.

Aaanyways, ero solo curioso di sapere se qualcuno avesse dei buoni argomenti sul perché avevano scelto di mettere una restrizione come questa su dove i metodi di estensione possono essere creati. Deve essere in una classe statica ha senso. non può essere in una classe statica nidificata non ... per me almeno ...

+0

Sembra che nessuna di queste risposte fornisca una buona motivazione tecnica per cui non può essere eseguita. –

+0

Come te, preferisco di gran lunga la sintassi del metodo di estensione. SomeThing.HasSomeCondition() è superiore a HasSomeCondition (SomeThing). – Mir

risposta

1

L'utilizzo di un metodo di estensione potrebbe davvero rendere il vostro codice molto più pulito di rispetto all'utilizzo di un metodo di supporto standard per la vostra classe?

// 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

forse no. Mi piace solo quando le cose non sono indietro. tipo. Anche se, forse, ho solo bisogno di aggiustare il mio pensiero da "griglia -> righe -> quelle controllate" a "quelle controllate di griglia -> righe" ... hmm ... ma immagino che questo tipo di trasforma in un soggettivo stile di codifica tipo di cosa ora. Buon punto però! =) Lo accetterà come una risposta, a meno che qualcuno non presenti un qualche tipo di cosa che riguarda Microsoft "il pensiero dietro a questo". – Svish

+2

@Svish (modo più tardi): non è (puramente) soggettivo: la systax non di estensione si compone male come è causa di nidificazione eccessiva (ad esempio scarsa leggibilità). la sintassi dell'estensione è una forma di lettura del lettore, se vuoi :-) –

2

Se si sta estendendo un tipo, i metodi di estensione devono essere uguali a quelli del tipo stesso.

Le best practice suggeriscono anche di mettere tutti i metodi di estensione in un posto, preferibilmente in una classe statica o contenuti in un singolo spazio dei nomi.

+5

Mettere tutti i metodi di estensione in un posto è una cattiva idea come mettere tutti i metodi di utilità in un unico posto. –

+0

Se stai estendendo un tipo, in nessun caso i metodi di estensione dovrebbero essere accessibili come il tipo sicuramente? –

+3

Sono con l'OP. Sarebbe bello limitare l'ambito dei tuoi metodi di estensione. A volte ciò che è necessario fare con il tipo si applica solo in uno scenario specifico ma si desidera comunque sfruttare lo zucchero sintetico dei metodi di estensione. – xr280xr

4

Se si possiede il codice sorgente del tipo, perché si utilizzano i metodi di estensione? Perché non si limitano a rendere tali metodi di estensione membri del tipo stesso?

I metodi di estensione sono i migliori per estendere i tipi che non sono stati creati. Mentre sono strumenti utili, sono uno strato di riferimento indiretto che dovrebbe essere l'ultima risorsa piuttosto che una prima. Mentre puoi usarli per estendere i tuoi tipi, è più sensato riservare il loro uso a tipi che non hai creato.

+0

Um, sono sicuro che non ha creato DataGridView ;-) –

+2

Ciao Andrew. Non posso essere d'accordo con te su questo. In alcuni casi ha senso decorare le classi esistenti con funzionalità aggiuntive senza renderle ampiamente disponibili. Potremmo o derivare, magari creare una classe decoratore o semplicemente utilizzare i metodi di estensione e in alcuni casi, i metodi di estensione aiutano qui. Prendi Unity, LINQ stesso e altri per questo comportamento. –