Mit .net 4.6 ist auch Visual Basic in einer neuen Version angelangt. Gemeinsam mit C#6 ist das neue Sprachfeature nameOf. Was hat es nun damit auf sich und gibt es da nicht schon?
Kurz gesagt liefert NameOf den Namen einer Klasse als String ohne Reflection bemühen zu müssen. Da dies auf Compiler Ebene geschieht, ohne Performance Nachteile.
Der Name einer Eigenschaft wird z.B. in jeder MVVM Property benötigt um die Notification an das User Interface auszulösen. Folgender Code wird jeden View Model Programmierer täglich Brot sein, wenn er die Klasse per Implements INotifyPropertyChanged mit dem Interface versieht.
1: Private newPropertyValue As String
2: Public Property NewProperty() As String
3: Get
4: Return newPropertyValue
5: End Get
6: Set(ByVal value As String)
7: newPropertyValue = value
8: RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NewProperty"))
9: End Set
10: End Property
11:
12: Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Das Code Schnippsel wurde mit Visual Studio 2015 im Code Editor per prop + TAB +TAB erstellt. Ich würde schwören das in früheren Versionen ein Unterstrich für die private interne Eigenschaft verwendet wurde.
In der Regel wird man in den VM Klassen eine Abstraktionsfunktion finden ala
1: Protected Sub OnPropertyChanged1(propertyName As String)
2: RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
3: End Sub
So muss nur noch OnPropertyChanged1 mit dem Namen der Eigenschaft als Parameter aufgerufen werden. Logik in Hochkommas ist allerdings schon seit SQL fehleranfällig.
Mit Visual Studio 2012 kommt ein Compiler Attribut, das den Namen eigenständig auflöst: Callermembername
1: Protected Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = Nothing)
2: RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
3: End Sub
In der Eigenschaft der Klasse reicht dann ein einfaches onPropertyChanged() (statt Zeile 8) und alles ist gut. Einziger Nachteil, das geht nur innerhalb von Funktionsparametern. Es kann sein, das man im Viewmodel aus einer Zuweisung eines Wertes das PropertyChanged Event eines anderen Propertys auslösen möchte. Jedenfall gibt es nun NameOf, das diese Flexibilität auch wieder durch den Compiler bringt.
1: OnPropertyChanged1(NameOf(NewProperty))