2009-04-21 11 views
9

Warum ist das? Ich würde es finden wirklich nice in der Lage sein, einige Extension-Methoden gesperrt zu haben, nur in einer meiner Klassen verwendet werden. überall verfügbar nicht wirklich will, bestimmte Erweiterungsmethoden haben ... und sie sehen so viel schöner als regelmäßige statische Methoden: PErweiterungsmethoden in verschachtelten statischen Klassen nicht erlaubt?


Zur Klarstellung:

Der Grund, warum ich diese Erweiterungsmethoden will, weil Ich erweitere ein Formular mit einem DataGridView. Und ich bin immer sehr müde von Zeilen wie diese:

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

Würde eine Erweiterungsmethode mag, so dass ich nur

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

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

Also mit anderen Worten, würde diese Erweiterung Methode überhaupt nicht sinnvoll sein, außerhalb dieser Klasse. Aber es würde den Code viel sauberer machen. Natürlich können auch normale Methoden gemacht werden, und das habe ich getan, weil das nicht möglich war.

Aaanyways, ich war nur neugierig zu wissen, ob jemand einige gute Argumente hatte, warum sie sich entschieden hatten, eine Einschränkung wie diese aufzusetzen, wo Erweiterungsmethoden verwendet werden können. Muss in einer statischen Klasse sein macht insgesamt Sinn. Kann nicht in einer verschachtelten statischen Klasse sein nicht ... für mich mindestens ...

+0

Sieht aus wie keine dieser Antworten geben einen guten technischen Grund, warum es nicht möglich ist. –

+0

Wie Sie, bevorzuge ich die Syntax der Erweiterungsmethode. SomeThing.HasSomeCondition() ist HasSomeCondition (SomeThing) überlegen. – Mir

Antwort

1

Würde eine Erweiterungsmethode wirklich Ihren Code viel sauberer machen als mit einer Standard-Helper-Methode für Ihre Klasse?

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

vielleicht nicht. Mir gefällt es einfach besser, wenn die Dinge nicht rückwärts laufen. So'ne Art. Obwohl, vielleicht muss ich nur mein Denken von "Gitter -> Reihen -> die geprüften" auf "die geprüften Gitter -> Reihen" einstellen ... hmm ... aber ich denke, diese Art von wird zu einem subjektiven coding style irgendwie jetzt. Guter Punkt obwohl! =) Wird es als eine Antwort akzeptieren, es sei denn, jemand kommt mit einigen Microsoft "den Gedanken hinter dieser" Art von Sache. – Svish

+2

@Swish (viel später): es ist nicht (rein) subjektiv: der Nicht-Erweiterungs-Systax ist schlecht zusammengesetzt, da er eine übermäßige Verschachtelung verursacht (d. H. Schlechte Lesbarkeit). Die Extensionssyntax ist eine Form des Reader-tailcalls, wenn du willst :-) –

2

Wenn Sie einen Typ erweitern, sollten die Erweiterungsmethoden genauso zugänglich sein wie der Typ selbst.

Best Practices schlagen auch vor, alle Erweiterungsmethoden an einer Stelle zu platzieren, vorzugsweise in einer statischen Klasse oder in einem einzigen Namespace.

+5

Das Setzen aller Erweiterungsmethoden an einem Ort ist ebenso eine schlechte Idee wie das Einfügen aller Hilfsmethoden an einem Ort. –

+0

Wenn Sie einen Typ erweitern, sollten Erweiterungsmethoden zu keinem Zeitpunkt so zugänglich sein wie der Typ? –

+3

Ich bin mit dem OP. Es wäre schön, den Umfang Ihrer Erweiterungsmethoden zu begrenzen. Manchmal, was Sie mit dem Typ tun müssen, gilt nur in einem bestimmten Szenario, aber Sie möchten immer noch den Vorteil der syntaktischen Zucker der Erweiterungsmethoden nutzen. – xr280xr

4

Wenn Sie den Quellcode des Typs besitzen, warum verwenden Sie Erweiterungsmethoden? Warum machen Sie nicht einfach diese Erweiterungsmethoden zum Typ selbst?

Erweiterungsmethoden werden am besten verwendet, um Typen zu erweitern, die Sie nicht erstellt haben. Während sie nützliche Werkzeuge sind, sind sie eine indirekte Ebene, die eher ein letzter Ausweg als ein erster sein sollte. Während Sie sie verwenden können, um Ihre eigenen Typen zu erweitern, ist es sinnvoller, ihre Verwendung für Typen zu reservieren, die Sie nicht erstellt haben.

+0

Ähm, ziemlich sicher, dass er DataGridView nicht erstellt hat ;-) –

+2

Hi Andrew. Dem kann ich nicht zustimmen. In manchen Fällen ist es sinnvoll, vorhandene Klassen mit zusätzlichen Funktionen zu dekorieren, ohne sie weitgehend verfügbar zu machen. Wir könnten entweder ableiten, vielleicht eine Decorator-Klasse erstellen oder einfach Erweiterungsmethoden verwenden, und in manchen Fällen helfen hier Erweiterungsmethoden. Nehmen Sie Unity, LINQ selbst und andere für dieses Verhalten. –

Verwandte Themen