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?