CallerMemberName – mai bine mai târziu decât niciodată

Printre avalașa de noutăți aduse de VS11 beta, .NET 4.5 beta, C# 5.0 beta s-a strecurat un mic feature care ar fi făcut viața mai ușoară la mulți programatori dacă ar fi apărut cu 10 ani în urmă: CallerMemberNameAttribute

Oricine a programat în WindowsForms sau WPF își aduce aminte cât de boring era să se implementeze INotifyPropertyChanged pentru toate property-urile unei clase care avea nevoie de data binding:

public string FirstName
{
get { return _firstName; }
set { _firstName = value; NotifyPropertyChanged("FirstName"); }
}

mai ales când aveam de-a face cu 30- 40 de clase, fiecare cu o gramadă de properties.

Genul ăsta de cod venea cu două probleme:
– repetitive code
– nume de properties hardcodate ca string-uri, deci error prone și mai greu de refactorizat (pentru cine nu avea tooluri gen Resharper, care se uită și în stringuri)

Desigur, soluții există: generatoare de cod, lambda expressions, tehnici gen AOP (ex. folosind PostSharp), code weaving (http://code.google.com/p/notifypropertyweaver/), stack walking etc, dar toate implică un oarecare efort până sunt implementate într-un proiect nou..

CallerMemberName e un atribut, care se poate aplica la un parametru opțional al unei metode, cu o valoare default specificată, și care va putea fi folosit pentru a pasa “automat” numele caller-ului (metodă, constructor, etc.). Desigur, în esență e un sintactic sugar, dar care ne ușurează munca:

public string FirstName
{
get { return _firstName; }
set
{ _firstName = value;
if (_firstName != value) { NotifyPropertyChanged(); }
}
}
// ...

protected void NotifyPropertyChanged([CallerMemberName] string property = null)
{
var tempEventCopy = PropertyChanged:
if (tempEventCopy != null)
{
tempEventCopy(this, new PropertyChangedEventArgs(property));
}
}
public event PropertyChangedEventHandler PropertyChanged;

Desigur, ramane problema codului repetitiv, dar refactoring-ul se simplifică si erorile de typing dispar.
Un alt avantaj e la capitotul performanță – față de tehnici gen stalk walking sau chiar lambda expressions, în acest caz totul se întâmplă a compilare.
Față de tehnici gen AOP și code weaving are avantajul că nu trebuie să ne amestecăm in procesul de build, instalăm componente suplimentare pe build server etc.

Advertisements
This entry was posted in .NET, C# and tagged , , , . Bookmark the permalink.

2 Responses to CallerMemberName – mai bine mai târziu decât niciodată

  1. Andrei Ignat says:

    F. interesant! Si alte chestii noi?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s