Visual Basic .net 14 nameOf

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))
Kommentare sind geschlossen