Was ist der Unterschied zwischen einer parametrisierten Eigenschaft und Funktion in vb.net?

8

Ich komme aus der C # -Welt nach VB.NET und das verwirrt mich. Warum gibt es 2 Möglichkeiten, das Gleiche zu tun? oder gibt es einen Unterschied, den ich nicht kenne?

Was ist der Unterschied zwischen den folgenden:

%Vor%

und

%Vor%

Wann benutzt du eins im Gegensatz zu dem anderen?

    
Denis 15.03.2012, 21:18
quelle

3 Antworten

10

Funktional Es gibt keinen Unterschied, beide geben einen Wert basierend auf einem Parameter zurück. Tatsächlich werden Eigenschaften während der Kompilierung tatsächlich in Funktionen umgewandelt, da der Begriff einer -Eigenschaft in nicht existiert MSIL .

Semantisch gibt es jedoch einen Unterschied in der Art und Weise, wie verwendet werden soll. Eigenschaften sind dazu gedacht, den internen Zustand eines Objekts zu offenbaren. Funktionen hingegen sollen den Zustand eines Objekts bedienen , um entweder eine Antwort auf eine bestimmte Frage (eine Abfrage ) zu geben oder den Zustand auf irgendeine Weise zu ändern (Ein Befehl ).

Hier ist ein Beispiel:

%Vor%

Während Size einfach eine Eigenschaft des Objekts freigibt, führt die IsSquare Funktion tatsächlich eine Operation im internen Zustand des Objekts durch, um eine Frage zu beantworten.

Nach diesem Prinzip ist der häufigste Anwendungsfall für parametrisierte Eigenschaften in VB.NET in Klassen, die für eine Sequenz von Elementen stehen, wobei der Parameter für den Zugriff auf ein bestimmtes Element in der Sequenz verwendet wird durch seine Position oder durch einen eindeutigen Schlüssel. Mit anderen Worten: Erstellen Sie so genannte Indexer in C #.

    
Enrico Campidoglio 15.03.2012, 21:47
quelle
10

Hinter dieser Frage steckt eine Menge Geschichte, die auf das Jahr 1997 zurückgeht, als Microsoft die COM-Automatisierungsspezifikation veröffentlichte. Welche erlaubten Property Setter / Getter haben Argumente. Visual Basic war ein früher Anwender der Spezifikation, der zu einem großen Teil von der Sprache getrieben wurde, um einen Ersatz für das VBX-Erweiterungsmodell zu finden. Was zu dieser Zeit ausging, war stark abhängig von dem 16-Bit-Codierungsmodell.

Das C # -Team hatte eine recht no-nonsense Haltung gegenüber dem Feature, sie hassen absolut Syntax-Ambiguitäten. Das gehört einfach nicht in eine neue Sprache. VB.NET hatte nicht den gleichen Luxus, sie mussten zumindest einige Features der Vorgängergeneration VB6 unterstützen.

Vor zehn Jahren musste das C # -Team aufgrund der großen Nachfrage ein wenig zurücktreten. Indizierte Eigenschaften sind beispielsweise im Office-Objektmodell weit verbreitet. In C # Version 4 erlaubten sie indexierte Eigenschaften ausschließlich für COM-Schnittstellen, um den Schmerz beim Schreiben von C # Office-Code zu mildern. Und noch mehr, optionale und benannte Argumente wurden hinzugefügt, um mit der Art.Missing Misery umzugehen. Und das dynamische Schlüsselwort zur Unterstützung der späten Bindung, ein weiteres wichtiges Merkmal von COM und Visual Basic, das wirklich in C # ohne dieses Schlüsselwort schmerzhaft war.

Lange Rede kurzer Sinn, COM ist schön, die Eleganz von IUnknown ist stark. Tony Williams ist das Genie dahinter. Video ist hier , viel sehenswert. Die Teilmenge der COM-Automatisierung, IDispatch, ist nicht so schön. Aber es war unglaublich erfolgreich. Sprachen ignorieren es auf eigene Gefahr. C # nicht.

Diese Details mögen aus einer längst vergangenen Ära geheimnisvoll klingen, sind es aber nicht. Die nächste Version der Windows-API WinRT basiert vollständig auf IUnknown. Sonst bekannt als "Metro" oder "Modern UI". IDispatch überlebte nicht, ersetzt durch IInspectable.

    
Hans Passant 15.03.2012 22:03
quelle
5

Die Eigenschaft kann auch einen Setter haben:

%Vor%

Das macht einen Unterschied, weil Sie so etwas schreiben können:

%Vor%

C # erlaubt Ihnen nur, dies über Eigenschaftenindexer zu bestimmen:

%Vor%

Das bedeutet, dass Sie in C # nur eine indexierte Eigenschaft pro Typ haben können. VB.Net erlaubt mehr als eine indizierte Eigenschaft für einen Typ. Um eine gleichwertige Syntax zu erhalten, müsste C # entweder das zugrundeliegende Wörterbuch direkt verfügbar machen oder, wenn Sie anderen Code im Getter / Setter haben (wie zum Beispiel Logging), müssten Sie einen zusätzlichen Typ zum Umschließen Ihres Wörterbuchs erstellen.

    
Joel Coehoorn 15.03.2012 21:54
quelle

Tags und Links