web-dev-qa-db-fra.com

Lors de l'initialisation dans les constructeurs C #, quoi de mieux: listes d'initialisation ou affectation?

La classe A utilise une liste d'initialisation pour définir le membre sur la valeur de paramètre, tandis que la classe B utilise l'affectation dans le corps du constructeur.

Quelqu'un peut-il donner une raison de préférer l'un à l'autre tant que je suis cohérent?

class A
{
    String _filename;

    A(String filename) : _filename(filename)
    {
    }
}


class B
{
    String _filename;

    B(String filename)
    {
        _filename = filename;
    }
}
29
mindless.panda

Le premier n'est pas légal en C #. Les deux seuls éléments qui peuvent apparaître après les deux-points dans un constructeur sont base et this.

J'irais donc avec le deuxième.

78
JaredPar

Voulez-vous dire C++ au lieu de C #?

Pour C++, les listes d'initialisation sont meilleures que l'affectation pour deux raisons:

  • Pour les types POD (int, float, etc.), l'optimiseur peut souvent effectuer une mémcpy plus efficace en arrière-plan lorsque vous fournissez des initialiseurs pour les données.
  • Pour les types (objets) non POD, vous gagnez en efficacité en ne faisant qu'une seule construction. Avec l'affectation dans le constructeur, le compilateur doit d'abord construire votre objet, puis l'affecter dans une étape distincte (cela s'applique également aux types POD).
17
Jeremy Bell

C # a une fonctionnalité appelée Object Initializer . Vous pouvez fournir des valeurs que le compilateur utilisera pour initialiser les membres spécifiés et appeler le constructeur par défaut. Pour que cela fonctionne, vous devez avoir un constructeur public par défaut.

1
Lyubomir Parvanov