Je pose cette question avec la performance comme préoccupation principale. Mais j'aimerais connaître d'autres avantages/inconvénients possibles pour les deux approches. La question est: Puisque les propriétés sont converties en méthodes dans IL, pourrait-il y avoir une pénalité de performance significative si les propriétés sont appelées au lieu d'accéder directement aux champs (à l'intérieur de la classe)?Accéder directement à la variable membre par l'intermédiaire de la propriété
Je suis en train de concevoir une classe de transformation (PersonalizationConstructor) dont le but est de "construire une entité de domaine" à partir d'IDataReader.
Je pense accepter IDataReader dans le constructeur de cette classe (PersonalizationConstructor) et avoir des propriétés virtuelles protégées pour renvoyer des données de l'ensemble d'enregistrements IDataReader; comme:
protected virtual string ProductFilterCriteria
{
get;
set;
}
Je pourrais avoir plus de 15 propriétés dans une classe pour cette implémentation. De cette façon, une propriété peut être surchargée pour vérifier si l'ensemble d'enregistrements a un champ "XXX" avant d'accéder à partir de l'ensemble d'enregistrements (je ne veux pas avoir cette vérification comme implémentation par défaut pour tous).
Est-il bon d'avoir plus de 15 propriétés virtuelles dans une classe pour implémenter le cas ci-dessus?
Veuillez ne pas trop vous concentrer sur IDataReader. Ma principale préoccupation est:
Comme les propriétés sont converties en méthodes IL, pourrait-il y avoir des performances importantes pénalité si propriétés sont appelées au lieu d'accéder à des champs directement (à partir de la classe)?
Je tiendrions quelque chose comme ceci:
class MainSite
{
protected virtual string ProductFilterCriteria
{
get
{
return _source["ProductFilterCriteria"];
}
}
protected virtual string Abc
{
get
{
return _source["Abc"];
}
}
protected virtual string Def
{
get
{
return _source["Def"];
}
}
..... many properties
}
class VirtualSite : MainSite
{
protected override string ProductFilterCriteria
{
get
{
return null;
}
}
}
Dans ce cas, il s'agit de propriétés virtuelles, ce qui signifie qu'elles ne peuvent pas être optimisées (sauf dans le cas où le type est connu pour sceller la propriété). –
@Jon: merci, vous avez absolument raison. Mais même dans ce cas, le gain de performance lié au passage d'une propriété à l'autre est négligeable dans presque tous les scénarios. – Abel