Valaki segítene elmagyarázni az alábbi C# kódrészletet?
namespace L9_2
{
class Bindable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OPC([CallerMemberName] string s = "")
{
PropertyChangedEventHandler handler =
PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(s));
}
}
}
}
1. Mi ez a [CallerMemberName]?
2. Miért kell inicalizálni egy függvény paramétert (string s-t)?
3. Miért kellett még egy PropertyChangedEventHandler típust létrehozni csak azért, hogy értékül adjuk neki az első értékét?
1. Egy attribútum.
Meg lehet vele jelölni osztályokat, függvényeket, paramétereket. Plusz információt hordoz.
2. Nem kell, de lehet.
3. Nem azért van ott, hogy értékül adja, hanem, hogy biztonságosabban tudja ellenőrizni, hogy null-e (van-e rajra event handler.
Így garantálja, hogy nem fog null reference exceptionre futni, míg ha simán csak az eventen ellenőrizné, akkor belefuthatna egy szinkronizációs hibába.
Ennek egyébként a modernebb formája az, hogy PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(s));
1. És hogy működik?
2. Lehetni biztos lehet de mi értelme van? A paraméter arra való hogy változó legyen, különben simán csak deklarálhatnánk a függvényben, hogy string s="" és nem kéne paraméter. Másfelől meg úgyis megváltozik az értéke, amikor függvényhíváskor megadjuk neki azt.
3. De az if(handler != null) épp azért van ott, hogy ellenőrizze hogy nem null. Nem írhatnánk oda rögtön be hogy if(PropertyChanged != null)?
1. [link]
Ez a konrét attribútom azt okozza, hogy a runtime beírja az s-be a hívó függvény nevét, ha az nem volt megadva.
2. Félreérted. Ez arra való, hogy így nem kötelező megadni a paramétert, opcionális paraméter lesz belőle, ami ilyen esetben az üres stringet veszi fel (pontosabban nem is azt, az előbbi attríbútum miatt)
3. Odaírhatnánk, csak néha (amikor az ellenőrzés meg a meghívás között pont leveszik a handlert az eseményről), akkor elromlana (thread safety problémaköre). Így meg a saját lokális változódon mindenképp ott marad a referencia a handlerre.
Pontosítanám az előző választ.
1) Az attribútum hatására a fordító fordítási időben írja be a hívó tag nevét. Megkönnyíti a dolgodat, mert a 'PropertyChanged' eseményhez hasonló szituációkban nem kell kézzel beírogatnod a nevet (ami még a nameof operátorral is kockázatot jelent), hanem a fordító fordítási időben lekezeli.
2) Azért, hogy opcionális lehessen - a 'CallerMemberName' attibútum elvárja, hogy a mögötte levő paraméter opcionális legyen. Így ugyanis a hívási helyen nem kell semmilyen explicit paramétert megadnod a függvénynek.
3) Elég pongyolán fogalmazott a programozó, amit írt, az tényleg hülyeség, felesleges az értékadás. Másrészt elegánsabb az alábbi forma használata:
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(s));
A '?.' (null-conditional) operátor az 'if (obj != null) obj.Method(...)' szerkezetek egyszerűbb leírására való.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!