Zatím jsem se příliš nezajímal o novinky v .NET 4.5. Nainstaloval jsem si ale Visual Studio 2012 RC a když už ho tu mám, začal jsem v něm psát jednu malou aplikaci pro mou vlastní potřebu. A náhodou jsem narazil na novou funkci, o kterou se musím podělit.
.NET 4.5 přináší tři nové atributy, pomocí kterých můžete získat informace o kódu, který zavolal aktuální metodu. Jednoduše deklarujete nepovinný parameter vhodného typu, přidáte jeden z těchto atributů a běhové prostředí se postará o vyplnění hodnoty.
Jde o tyto atributy:
CallerFilePathAttribute – jméno zdrojového souboru s cestou
CallerLineNumberAttribute – číslo řádku
CallerMemberNameAttribute – jméno volajícího člena (metody, vlastnosti apod.)
Použití pak vypadá například takto:
void Test([CallerLineNumber] lineNumber = 0) { … }
To může být užitečné pro diagnostiku, logování a podobně, ale existuje i jiný, velmi častý scénář, kdy se toto hodí (a jak jsem na to narazil já).
Implementace rozhraní INotifyPropertyChanged (používané pro data binding ve Windows Forms a WPF) ve starších verzích .NET frameworku vyžaduje parametr s názvem změněné vlastnosti:
// Deklarace private void NotifyPropertyChanged(string propertyName) { … } // Použití public string Name { set { if (name != value) { name = value; NotifyPropertyChanged("Name"); } } }
Název vlastnosti je při volání uveden jako text, takže samozřejmě není kontrolován kompilátorem a snadno dojde k nějaké chybě.
Existují i alternativní implementace – například lze s trochou snahy specifikovat vlastnost pomocí lambda výrazu (viz zde). Nicméně implementace pomocí CallerMemberNameAttribute v .NET 4.5 je zcela přímočará:
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") { … } public string Name { set { if (name != value) { name = value; NotifyPropertyChanged(); } } }
Je to celé popsáno na MSDN, takže podrobnosti si snadno najdete. Jen musíte vědět, že něco takového vůbec existuje.