Kezdőlap > Visual Studio 2012 > C# 5.0 caller info attributes és INotifyPropertyChanged

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: ,
About these ads
Kategóriák:Visual Studio 2012 Címke:
  1. 2012.03.1. 11:13 - 11:13 | #1

    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
    2012.03.2. 19:53 - 19:53 | #2

    É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
    2012.03.2. 23:57 - 23:57 | #4

    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. 2012.04.4. 13:11 - 13:11 | #5

    Managed kód esetén eddig is ki lehetett reflektálni ezeket az infókat futásidőben (lásd StackTrace osztály, http://msdn.microsoft.com/en-us/library/System.Diagnostics.StackTrace.aspx ).

    Ez a játék fordítási időben zajlik – futásidőben csak átpasszolja a hívottnak azokat az értékeket amiket a hívó oldalra odadrótozott. Gondolom azért került bele csak most, mert kellett hozzá az opcionális paraméterek támogatása.

  5. 2012.04.26. 5:57 - 05:57 | #6

    Már az MSDN-ben is ez a példa szerepel: http://msdn.microsoft.com/en-us/library/ms229614(v=vs.110).aspx

  6. stm
    2012.06.16. 14:57 - 14:57 | #7

    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…

    • 2012.06.16. 17:36 - 17:36 | #8

      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.

  1. 2012.06.30. 23:57 - 23:57 | #1

MINDEN VÉLEMÉNY SZÁMÍT!

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

You are commenting using your WordPress.com account. Kilépés / Módosítás )

Twitter kép

You are commenting using your Twitter account. Kilépés / Módosítás )

Facebook kép

You are commenting using your Facebook account. Kilépés / Módosítás )

Google+ kép

You are commenting using your Google+ account. Kilépés / Módosítás )

Kapcsolódás: %s

Követés

Értesítést küldünk minden új bejegyzésről a megadott e-mail címre.

Csatlakozz a 76 követőhöz

%d blogger ezt szereti: