2015-04-23 1 views
-1

Lors de l'initialisation d'une nouvelle liste en C#, les deux suivants compilera:La différence entre la nouvelle liste() {...} et nouvelle liste {...}

(1) List<string> s = new List<string>() { "value" };

et

(2) List<string> s = new List<string> { "value" };

Quelle est la différence entre les cas 1 et 2?

+11

Il n'y en a pas. C'est juste que le '()' est optionnel pour cette déclaration. (Resharper met en garde contre le redondant '()'.) –

+0

Voir [duplicate] (http://stackoverflow.com/questions/3661025/why-are-c-sharp-3-0-object-initializer-constructor-parentheses- optionnel) (qui parle des initialiseurs d'objets, qui sont dans le même parc de balles), qui renvoie à [Paroisses facultatives ambiguës, première partie] (http://blogs.msdn.com/b/ericlippert/archive/2010/09/ 20/ambiguous-optional-parentheses.aspx). Les blogs d'Eric Lippert expliquent très bien la logique du "pourquoi" de la conception du langage. – CodeCaster

Répondre

1

Ceci sonne vrai pour tout type. Généralement, vous spécifiez () si vous devez transmettre un élément au constructeur de types qu'il n'expose pas pour la définition publique. S'il n'y a pas besoin de paramètres, les () sont simplement fluff.

Envisagez le scénario que vous pouvez faire une validation supplémentaire/logique à une propriété et vous ne permettent pas la manipulation directe de celui-ci:

public class Foo 
{ 
    private string Bar { get; set; } 

    public string FooBar { get; set; } 

    public Foo (string bar) 
    { 
     Bar = bar + "foo"; 
    } 
} 

Alors ceci est permis:

var foo = new Foo("bar") 
{ 
    FooBar = "foobar" 
}; 

Pourtant, ce n'est pas:

var foo = new Foo 
{ 
    Bar = "bar", 
    FooBar = "foobar" 
}; 

Il y a quelques types C# qui ne vous permettent de se t certaines propriétés dans le constructeur.

+0

Vous pouvez spécifier que les parenthèses restent obligatoires si vous n'initialisez pas les propriétés dans l'initialiseur de champ. –

0

Cette dernière est appelée Initialisation d'objet. Vous pouvez également utiliser MyClass m = new MyClass { MyVar = 3 };

+3

* Ce dernier est utilisé le Field Initializer *? Quelle? [Initialisation de champ] (https://msdn.microsoft.com/en-us/library/aa645759%28v=vs.71%29.aspx) –

+1

Ce n'est pas appelé Initialisation de champ. C'est ce qu'on appelle un initialiseur de collection. L'alternative que vous donnez s'appelle un initialiseur d'objet. Les initialiseurs de champ sont les valeurs par défaut que vous donnez aux champs dans une déclaration de classe. – Rawling

+0

@Rawling En effet, j'ai changé cela. – HimBromBeere

1

Il n'y a pas de différence. Il sera traduit par:

List<string> s1 = new List<string>(); 
s1.Add("value"); 
List<string> s2 = new List<string>(); 
s2.Add("value"); 
1

De 7.6.10.1 expressions de création d'objets du C# reference 5.0:

Une expression de création d'objet peut omettre la liste des arguments du constructeur et les parenthèses enserrant pour autant qu'il comporte un initialiseur d'objet ou initialisateur de collection. L'omission de la liste d'arguments constructeur et des parenthèses englobantes équivaut à spécifier une liste d'arguments vide.

+1

J'ai fusionné ma réponse (en ajoutant le lien) au vôtre – xanatos

+0

Merci xanatos, j'ai eu du mal à trouver un numéro de section. – Rawling