web-dev-qa-db-fra.com

C #, struct vs class, plus rapide?

Duplicata possible:
Quel est le meilleur pour les structures/classes de stockage de données?

Prenons l'exemple où j'ai un objet Employé avec des attributs comme l'âge, le nom, le sexe, le titre, le salaire. J'ai maintenant une liste que je veux remplir avec un tas d'employés (chaque instance d'employé est unique).

En termes de vitesse et d'empreinte mémoire, est-il préférable de créer l'employé en tant que structure ou classe?

Toute mise en garde supplémentaire concernant Struct vs Classe dans le scénario ci-dessus est la bienvenue

17
AMH

Les structures doivent être utilisées uniquement pour des structures relativement petites qui devraient avoir un comportement de valeur.

Ne définissez pas de structure à moins que le type n'ait toutes les caractéristiques suivantes :

  • Il représente logiquement une valeur unique, similaire aux types primitifs (entier, double, etc.).
  • Il a une taille d'instance inférieure à 16 octets.
  • C'est immuable.
  • Il n'aura pas à être emballé fréquemment.

Votre type rompt les deux premières lignes directrices, et probablement aussi la troisième. Vous devez donc certainement utiliser une classe ici.

33
Mark Byers

Ce n'est pas aussi simple que cela - vous devez décrire le comportement . Par exemple, un struct se copiera lui-même dès que vous le souhaitez, donc à certains égards, il peut consommer plus de mémoire. Cependant, un tableau de structures en tant que vidage de données brutes peut éviter un en-tête d'objet (très petit) (et une déréférence supplémentaire), donc peut avoir des efficacités.

Un problème plus important, cependant, réside dans la façon dont vous les conceptualisez; un employé n'est pas une valeur ; si j'attribue:

var emp = GetEmployee();
var tmp = emp;

cela signifie-t-il que je devrais maintenant avoir 2 employés? Ce n'est probablement pas le cas. Et si je change:

tmp.Name = "Fred";

si cela a un impact sur emp, qu'il s'agisse de struct ou de classe. Je parie que ça devrait être classe ici. Je propose également qu'une structure devrait presque toujours être immuable pour éviter ce type de scénario de perte de données. Il existe des arguments pour les structures mutables, mais elles sont si souvent utilisées de manière incorrecte que je ne veux pas vous encourager accidentellement à le faire.

D'autres problèmes surviennent avec l'encapsulation avec des structures; considérer qu'un employé a un gestionnaire; Est-ce possible?

[struct|class] Manager {
    private Manager boss;
}

cela ne fonctionne que pour une classe. Encore; Les structures ne sont pas bien adaptées à ce type d'utilisation. Ni polymorphisme, abstraction, etc.

12
Marc Gravell

Cela dépend, probablement une classe serait bien dans ce cas. J'espère que les points ci-dessous vous aideront à décider.

L'utilisation de la structure dans les conditions suivantes est souhaitable.

Lorsque vous avez une petite structure de données

La structure de données ne nécessite pas d'étendre la fonctionnalité.

Lorsque vous souhaitez effectuer une opération plus rapide sur la structure des données. (Comme la structure est stockée sur la pile, les opérations effectuées sur celle-ci sont plus rapides.)

L'utilisation de la classe dans les conditions suivantes est souhaitable.

Lorsque vous avez une structure de données complexe

La structure de données nécessite d'étendre les fonctionnalités.

Lorsque vous souhaitez optimiser l'utilisation de la mémoire. (Comme la classe est stockée sur un tas, elles sont sur le point d'être récupérées quand aucune référence ne pointe vers un objet.)

Regardez ici pour plus de détails.

3
CharithJ