2011-03-01 7 views
4

Salut Je me demandais s'il y a une différence entre l'initialisation objet comme celui-ciDifférents types d'initialisation d'objet

MyClass calass = new MyClass() 
{ 
    firstProperty = "text", 
    secondProperty = "text" 
} 

et objet initializaing comme celui-ci

MyClass calass = new MyClass // no brackets 
{ 
    firstProperty = "text", 
    secondProperty = "text" 
} 

Je me demandais aussi quel est le nom de ce type d'initialisation

Répondre

8

Non, absolument aucune différence. Dans les deux cas, vous utilisez une expression d'initialisation d'objet. initialiseurs d'objets ont été introduits en C# 3.

Dans les deux cas, c'est exactement équivalent à:

// tmp is a hidden variable, effectively. You don't get to see it. 
MyClass tmp = new MyClass(); 
tmp.firstProperty = "text"; 
tmp.secondProperty = "text"; 

// This is your "real" variable 
MyClass calass = tmp; 

Notez comment l'affectation à calass ne se produit après les propriétés ont été attribuées - comme vous » d attendre du code source. (Dans certains cas, je crois que le compilateur C# peut efficacement supprimer la variable supplémentaire et réorganiser les affectations, mais il doit se comporter comme cette traduction.) Cela peut certainement faire une différence si vous réattribuez une variable existante.)

EDIT: Léger point relatif à l'omission des arguments du constructeur. Si vous le faites, cela équivaut toujours à inclure une liste d'arguments vide - mais c'est pas le même que d'être équivalent à appeler le constructeur sans paramètre. Par exemple, il peut y avoir des paramètres facultatifs ou des tableaux de paramètres:

using System; 
class Test 
{ 
    int y; 

    Test(int x = 0) 
    { 
     Console.WriteLine(x); 
    } 

    static void Main() 
    { 
     // This is still okay, even though there's no geniune parameterless 
     // constructor 
     Test t = new Test 
     { 
      y = 10 
     }; 
    } 
} 
+0

Pourriez-vous me dire si j'utilise l'expression initializer le constructeur par défaut sera appelé? – Berial

+0

@Berial: Les deux sont des expressions d'initialisation d'objet - mais oui, si vous ne spécifiez pas une liste d'arguments pour le constructeur, ce sera comme si vous aviez spécifié une liste d'arguments vide. –

2

Nope. En fait, ReSharper se plaindrait que les crochets d'un constructeur sans paramètre avec initialiseur sont redondants. Vous en auriez (évidemment) besoin si vous utilisiez un constructeur avec un ou plusieurs paramètres, mais comme ce n'est pas le cas, supprimez-les.