Je comprends la frustration de l'OP, cette utilisation du virtuel n'est pas pour l'abstraction modélisée pour laquelle le modificateur virtuel de facto est efficace.
Si certains d'entre vous ont encore des difficultés à cet égard, je vous propose mon point de vue, car j'essaie de garder les solutions simples et le jargon au minimum :
Entity Framework utilise le chargement paresseux, ce qui revient à préparer quelque chose pour une exécution future. Cela correspond au modificateur "virtuel", mais il y a plus que cela.
Dans Entity Framework, l'utilisation d'une propriété de navigation virtuelle vous permet de la désigner comme l'équivalent d'une clé étrangère nullable en SQL. Il n'est pas nécessaire de joindre rapidement toutes les tables à clé lors d'une requête, mais lorsque vous avez besoin de l'information, celle-ci est déterminée par la demande.
J'ai également mentionné nullable parce que de nombreuses propriétés de navigation ne sont pas pertinentes au départ. Par exemple, dans un scénario client / commandes, vous ne devez pas attendre le moment où une commande est traitée pour créer un client. Vous pouvez le faire, mais si vous aviez un processus en plusieurs étapes pour y parvenir, vous pourriez avoir besoin de persister les données du client pour les compléter ultérieurement ou pour les déployer sur de futures commandes. Si toutes les propriétés de la navigation étaient mises en œuvre, il faudrait établir chaque clé étrangère et chaque champ relationnel lors de la sauvegarde. Cela ne fait que remettre les données en mémoire, ce qui va à l'encontre du rôle de la persistance.
Ainsi, bien que cela puisse sembler cryptique dans l'exécution réelle au moment de l'exécution, j'ai constaté que la meilleure règle empirique à utiliser est la suivante : si vous produisez des données (lecture dans un modèle de vue ou un modèle sérialisable) et que vous avez besoin de valeurs avant les références, n'utilisez pas de virtuel ; si votre champ d'application recueille des données qui peuvent être incomplètes ou si vous avez besoin de rechercher et de ne pas exiger que chaque paramètre de recherche soit complété pour une recherche, le code fera bon usage de la référence, de manière similaire à l'utilisation de propriétés de valeur nullable int ? long ? De même, l'abstraction de votre logique métier de votre collecte de données jusqu'à ce que vous ayez besoin de l'injecter présente de nombreux avantages en termes de performances, comme l'instanciation d'un objet et son démarrage à null. Entity Framework utilise beaucoup de réflexion et de dynamique, ce qui peut dégrader les performances, et la nécessité de disposer d'un modèle flexible qui peut s'adapter à la demande est essentielle pour gérer les performances.
Pour moi, cela a toujours été plus logique que d'utiliser un jargon technique surchargé comme les proxies, les délégués, les gestionnaires et autres. Une fois que vous avez atteint votre troisième ou quatrième langue de programmation, cela peut devenir compliqué.
10 votes
Voulez-vous comprendre l'objectif général du mot-clé "virtual" en C# ou comment il se rapporte spécifiquement à Entity Framework ?
4 votes
@M.Babcock : Je demande quel est le but en ce qui concerne les propriétés, car je n'ai jamais vu cela auparavant.
1 votes
Si vous êtes familier avec la façon dont le mot-clé virtual affecte le polymorphisme dans les méthodes, il en va de même pour les propriétés.
0 votes
Le but de votre question n'était-il pas de comprendre l'objectif général du mot-clé "virtual" en C# ?
1 votes
@M.Babcock : non, parce que je connais son utilisation avec les méthodes en ce sens qu'elle permet de remplacer la méthode. Je ne comprends pas pourquoi quelqu'un voudrait remplacer une propriété.
28 votes
@M.Babcock : comment aurais-je pu être plus clair ? La question s'intitule "Pourquoi utiliser 'virtual' pour les propriétés des classes".
2 votes
@Gary - Les propriétés getter / setter sont en fait compilées de manière statique dans les méthodes. Il ne s'agit donc pas de champs de classe traditionnels tels que "public virtual Dinner" ;