C# 5.0 caller info attributes és INotifyPropertyChanged

A C# 5.0-ban lesz néhány új nyelvi elem, melyek közül az egyik a “caller info attributes. Egyszerűen fogalmazva arról van szó, hogy ha egy metódus bemeneti paramétereit ellátjuk néhány attribútummal, akkor azok a paraméterek futási időben meg fogják kapni a hívó függvény nevét, valamint annak a fájlnak a teljes elérési útját és azon belül a sor számát, ahol a hívó található. Az attribútumok:

[CallerMemberName]

[CallerFilePath]

[CallerLineNumber]

A legtöbb felhasználási példa arról szól, hogy ezek az attribútumok milyen kiválóan használhatók naplózásra, de használhatjuk őket például az INotifyPropertyChanged interfész implementálásakor is:

public class Widget : INotifyPropertyChanged
{
    private string statusText;
    public string StatusText
    {
        get { return statusText; }
        set { statusText = value; NotifyPropertyChanged(); }
    }

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

A példát a C# FAQ blogból kölcsönöztem, ahol további linkek találhatóak a C# 5.0-val és a Visual Studio 11 Bétával kapcsolatban.

 

Technorati-címkék: ,

9 thoughts on “C# 5.0 caller info attributes és INotifyPropertyChanged

  1. kketto

    Igen a példa jó! Mert a refactoring cuccok, nem valószínű, hogy észreveszik a member átnevezésnél, hogy kezit csókolom, ő meg még stringben is ott figyelget!🙂

  2. nyelvész

    Én igazából aszt nem érem, hogy miért kellett az ilyen fícsörökkel eddig várni?
    Miért nincs benne az 1.0-s C#-tól a nyelvben olyan “makró”, amit a fordító pl. behelyettesít pl. a függvény névterável, osztályával, nevével stb…
    És így tovább a forrás fájl nevével, az éppen aktuális sor számával, stb…
    ???

  3. nyelvész

    Azt hiszem félreértettél.
    Nem azt írtam, hogy miért hagyták ki a C/C++ makróképességét a C#-ból (nekem se hiányzik), ezért is tettem idézőjelek közé a makrót, de nem sokat segített a makrón🙂, (láthatóan vérbeli C#-os vagy, mert ráharaptál a makróra) hanem arra, hogy miért nincsenek _előre_ definiált konstansoknak, emelyek pl. megmondják, hogy ez itt pont az xyz nevű függvény, ez itt az 123. sor az akarmi nevű fájlban, stb.

    void foo()
    {
    Console.WriteLine(“Ez itt a(z) {0} függvény, a(z) {1}. sorban, a(z) {2} fájlban”,_FUNCTION_NAME_, _LINE_, _FILE_);
    }

    Szóval szépek az attribútumok, de józan paraszti eszemnek megfelelőbbek ezek a “makrók” az ilyen eccerű feladatokra. Amiről írsz (ki volt a hívó), arra nyilván nem tud fordítási időben választ adni a fordító, de az ilyen esetekre meg legenerálja a kódot, ami megfejti, hogy ki volt a hívó; a CLR fölött futó kódok esetében ez nem különösebben lehet nehéz megállapítania a CLR-nek, vagy igen?

    Amúgy a C/C++-ban van már __FUNCTION__, vagy valami hasonló? (__LINE__, meg __FILE__, az volt, de hogy épp melyik függvényben “szenvedtem”, arra nem adott támogatást a nyelv; emlékeim szerint)

  4. stm

    Lesz valamilyen értelmes új feature is? Mert ezt, illetve az async keyword-öt nem nevezném annak. Pontosabban, ha csak ennyi lesz az újdonság az kiábrándító.

    Tudom ne álmodozzunk delete operátorról, és többszörös öröklődésrél, illetve más elavult dolgokról, de azért…

    1. Balássy György Szerző

      Szerintem az async és az awawit elég értelmes feature, amivel nehéz versenyezni. A caller info attribute egy hasznos mellékszál, de ugyanígy hasznos, hogy végre lehet ciklusváltozót helyesen használni lambda kifejezésben.

  5. Visszajelzés: INotifyPropertyChanged Implementation for VS2012 - Leaning Into Windows

Hozzászólás

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s