raisepropertychanged propertyname property onpropertychanged change c# inotifypropertychanged callermembername

c# - propertyname - ¿Es[CallerMemberName] lento en comparación con las alternativas al implementar INotifyPropertyChanged?



protected virtual void onpropertychanged([ callermembername string propertyname null (1)

No, el uso de [CallerMemberName] no es más lento que la implementación básica superior.

Esto se debe a que, según esta página de MSDN ,

Los valores de información de llamada se emiten como literales en el lenguaje intermedio (IL) en tiempo de compilación

Podemos verificarlo con cualquier desensamblador IL (como ILSpy ): el código para la operación "ESTABLECIMIENTO" de la propiedad se compila exactamente de la misma manera:

Entonces no use Reflection aquí.

(muestra compilada con VS2013)

Hay buenos artículos que sugieren diferentes formas de implementar INotifyPropertyChanged .

Considere la siguiente implementación básica:

class BasicClass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void FirePropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } private int sampleIntField; public int SampleIntProperty { get { return sampleIntField; } set { if (value != sampleIntField) { sampleIntField = value; FirePropertyChanged("SampleIntProperty"); // ouch ! magic string here } } } }

Me gustaría reemplazarlo con este:

using System.Runtime.CompilerServices; class BetterClass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; // Check the attribute in the following line : private void FirePropertyChanged([CallerMemberName] string propertyName = null) { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } private int sampleIntField; public int SampleIntProperty { get { return sampleIntField; } set { if (value != sampleIntField) { sampleIntField = value; // no "magic string" in the following line : FirePropertyChanged(); } } } }

Pero a veces leo que el atributo [CallerMemberName] tiene un rendimiento pobre en comparación con las alternativas. ¿Es eso cierto y por qué? ¿Utiliza el reflejo?