web-dev-qa-db-fra.com

Les structures peuvent contenir des champs de types de référence

Les structures peuvent-elles contenir des champs de types de référence? Et s'ils peuvent, c'est une mauvaise pratique?

52
James Hay

Oui, ils peuvent. Est-ce que c'est une bonne idée? Eh bien, cela dépend de la situation. Personnellement, je crée rarement mes propres structures en premier lieu ... Je traiterais toute nouvelle structure définie par l'utilisateur avec un certain degré de scepticisme. Je ne suggère pas que c'est toujours la mauvaise option, juste que cela nécessite plus d'argument clair qu'une classe.

Ce serait une mauvaise idée d'une structure d'avoir une référence à un objet mutable si ... sinon vous pouvez avoir deux valeurs qui regarder indépendante mais ne sont pas:

MyValueType foo = ...;
MyValueType bar = foo; // Value type, hence copy...

foo.List.Add("x");
// Eek, bar's list has now changed too!

Les structures mutables sont diaboliques. Les structures immuables avec des références à des types mutables sont un mal sournoisement de différentes manières.

81
Jon Skeet

Bien sûr et ce n'est pas une mauvaise pratique de le faire.

struct Example {
  public readonly string Field1;
}

Le réadonly n'est pas nécessaire, mais il est une bonne pratique de faire immuable de la structure.

19
JaredPar

Oui, c'est possible, et oui, c'est généralement une mauvaise pratique.

Si vous regardez le framework .NET elle-même, vous verrez pratiquement toutes les structures contiennent uniquement des types de valeur primitive.

4

La raison pour laquelle vous ne pouvez pas avoir de structures mutables est due au comportement des types de référence. Lisez cet article: http://www.yoda.arachsys.com/cshaarp/parameters.html

Lorsque vous avez une struct contenant un objet (tout ce qui n'est pas une primitive comme INT ou DOUBLE) et que vous copiez une instance de la structure, l'objet à l'intérieur n'est pas copié "Deep", car il s'agit simplement d'une référence (pointeur ) à un emplacement de mémoire contenant la classe actuelle. Donc, si vous copiez une struct mutable qui contient des instances de classe, la copie référencera les mêmes instances que l'original (la liste de la barre d'origine étant modifiée ci-dessus).

Si vous devez absolument que la structure soit mutable, faites des instances de classe à l'intérieur de la lecture, ou - c'est la mauvaise pratique - essayez de vous assurer de ne jamais effectuer une copie de la structure.

4
Matthew

Oui, ils peuvent.

Ça dépend.

Beaucoup tiennent la position selon laquelle une structure doit être immuable et, dans ce cas, une référence à un objet pourrait signifier que ce n'est pas le cas.

Mais cela dépend de la situation.