2008-09-26 10 views
17

Ich wollte dies für fließende Schnittstellen. Siehe zum Beispiel this Channel9 Diskussion. Würde wahrscheinlich require auch indizierte Eigenschaften hinzufügen.Sollten Erweiterungseigenschaften zu C# 4.0 hinzugefügt werden?

Was sind Ihre Gedanken? Würden die Vorteile die "Sprachflut" überwiegen?

+3

Diesen interessanten Blogeintrag von Eric Lippert zum Thema gefunden http://blogs.msdn.com/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx – Jon

+0

Lassen Sie diesen Link nicht Kommen Sie zu den agilen Evangelisten, sie werden ROTFLOL im besten Weird Al Stil. Sie legen eine Menge Arbeit in ein Feature und erst nachdem es fast fertig ist, bekommen Sie Feedback vom Hauptkonsumenten, raten Sie, was passiert ist? –

Antwort

6

In meinem Buch ist der # 1 der wichtigste Grund für Erweiterungseigenschaften die Implementierung von fließenden Interface-Patterns um unkowned Code. Ich baute ein Wrapper um die NHibernate Sitzung, um es intitutive mit zu arbeiten, so dass ich auf eine ähnliche Logik tun

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

die sehr dumm aussieht, dass ist, muss ein Verfahren sein, da es keine Möglichkeit für mich einzulegen die Ist eine Eigenschaft, es sei denn, ich ändere direkt die Quelle für das Sitzungsobjekt.

29

Da Eigenschaften nur syntaktischer Zucker für Methoden sind, sehe ich nicht, warum C# Erweiterungsmethoden ohne Erweiterungseigenschaften haben sollte.

3

Ich weiß nicht warum nicht. Eigenschaften sind nur Getter/Setter-Methoden mit unterschiedlicher Syntax.

1

Ich denke, es wäre großartig, solange es keine oder minimale Leistungseinbußen bei der Verwendung gibt.

0

Würde auf jeden Fall zu dem Repertoire von Werkzeugen zur Verfügung stellen.

Nun zu meiner Meinung, ja sie sollten, aber wie alles, Entwickler müssen es richtig verwenden und wenn nötig. Wie die meisten neuen Features verwenden viele Entwickler sie, ohne sie vollständig zu verstehen und wann/wie/wo/wie sie am besten zu verwenden sind. Ich weiß, dass ich manchmal auch darin eingesaugt werde.

Aber ya, sicher, bring es an. Ich könnte sehen, dass ich es in bestimmten Szenarien benutze

0

Ich rate Indizierte Eigenschaften wird ein bloßer Strumpf Stuffer unter einer großen Tasche von erheblichen Verbesserungen werden wir in 4.0 sehen.

2

Ich glaube nicht, Erweiterung Eigenschaften wären fast so nützlich. Ich finde, dass ich meistens Eigenschaften verwende, um Felder zu verkapseln (klassisches get; set;) oder um nur lesbare Güte zu liefern (nur ein get auf einem privaten, readonly, constructor-set Feld). Da Erweiterungen nicht auf private Mitglieder zugreifen können, sehe ich den Punkt nicht wirklich, besonders für "set;". Um etwas zu tun, "set"; müsste nur noch andere Methoden aufrufen. Dann stoßen Sie auf das Problem der Eigenschaften, die Ausnahmen auslösen.
Da Erweiterungen auf die Verwendung von öffentlichen Eigenschaften und Methoden beschränkt sind, finde ich es sauberer und einfacher, Code zu lesen, der eine Dienstprogrammklasse verwendet. Wenn es darauf ankommt, verwenden wir Erweiterungsmethoden, um LINQ hübsch aussehen zu lassen. Um Entwickler davon abzuhalten, das Falsche zu tun, kann ich hier und da in meinem LINQ mit einem Extra() umgehen und mich nur an Erweiterungsmethoden halten.

+0

Der Punkt ist, nicht mit extra(), der gleiche Punkt wie mit anderen syntaktischen Zucker zu behandeln – alpav

-3

Nein, eine Eigenschaft ist nur eine Möglichkeit zu verbergen, was wirklich für den Code generiert wurde. Wenn man sich die reflektierten Code aussehen oder die IL können Sie bestimmen, was Sie wirklich bekommen, und es ist die folgende:

public string MyProperty { get; set; } 

wird

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

Es ist nur 2 Methoden.

+0

Sie können nicht auf get_MyProperty() Databind – recursive

+0

Ich verstehe diese Antwort nicht - sind Sie impliziert, Sie sind kein Anwalt für regelmäßige Eigenschaften entweder? –

+0

Nein, ich habe nur darauf hingewiesen, dass das Konzept einer Eigenschaft ein IDE-Konzept ist, die IL nicht unterstützt etwas, das wie eine Eigenschaft aussieht. Mit get_MyProperty (dieses Objekt o) {...} können Sie die gleiche Funktionalität erreichen. Sicher, es ist nicht der gleiche syntaktische Zucker, den wir gewohnt sind, aber es ist das gleiche Gesamtergebnis. –

1

Scheint wie es könnte leicht missbraucht werden. Wie andere bereits erwähnt haben, sind C# -Eigenschaften nur syntaktischer Zucker für Methoden. Die Implementierung dieser Eigenschaften als Eigenschaften hat jedoch bestimmte Konnotationen: Der Zugriff hat keine Nebenwirkungen und das Ändern einer Eigenschaft sollte sehr kostengünstig sein. Der letzte Punkt ist entscheidend, da Erweiterungseigenschaften fast immer teurer sind als herkömmliche Eigenschaften.

9

Es geht um Datenbindung, sagen wir, ich habe ein Objekt für die Bindung an meine UI und ich möchte ausblenden zeigen es basierend auf anderen Eigenschaften des Objekts. Ich könnte eine Erweiterungseigenschaft für IsVisible oder Sichtbarkeit hinzufügen und diese Eigenschaft an die Benutzeroberfläche binden.

Sie können Erweiterungsmethoden nicht binden, aber das Hinzufügen von Eigenschaften für die Datenbindung zu vorhandenen Typen, die Sie nicht erweitern können, könnte sehr nützlich sein.

+0

Ja, ich brauche es auch zur Datenerfassung !!!! – tbone

+1

Das würde nicht funktionieren: Datenbindung verwendet Reflektion über den Typ des gebundenen Objekts, um die Eigenschaften zu erhalten. Eine Erweiterungseigenschaft würde in einem beliebigen zweiten Typ existieren, über den das Bindungsframework keine Kenntnis hätte. Erweiterungsmethoden (und Eigenschaften, sofern vorhanden) sind eine Kompilierzeit ohne erkennbare Laufzeit. –

+1

Es gibt Alternativen hierzu (ich weiß, dass ich zu spät bin, um zu antworten, aber ich habe diese Antwort bereits gesehen). Durch die Verwendung von Sammlungen, die einige Schnittstellen zur Datenbindung implementieren, können Sie der Sammlung weitere bindbare Eigenschaften hinzufügen. Mit anderen Worten, Sie können das Rezept für die Berechnung der IsVisible-Eigenschaft für die Auflistung an ein Gitter oder ähnliches binden. Natürlich, wenn Sie aus einer Textbox oder ähnlichem daran binden möchten, haben Sie wahrscheinlich kein Glück. –

0

Entwickler sollten Eigenschaften verwenden, um Hierarchie von Namen zu organisieren und Namensverkettung mit camel casing oder Unterstrichen zu vermeiden. Zum Beispiel sollten sie anstelle von HttpUtility.UrlDecode die String-Klasse erweitern, um etwas wie "some str" zu verwenden. Decode.url Momentan ist die einzige Möglichkeit, dies in C# zu tun: "some str" .decode(). Url

1

Wäre eine nette Sache zu haben, aber ich sehe viele Leute sagen, sie wollen es für die Datenbindung, die nicht möglich ist, da es Reflexion verwendet.

0

Ja, bitte.

Und fügen Sie auch indexierte Eigenschaften und STATISCHE Erweiterung Zeug, weil ich das für System.Console ERNSTENS wollen (das ist nicht als Witz gemeint!).

Verwandte Themen