ReSharper vous donne une meilleure suggestion sur la manière d'instancier l'élément TDest
classe.
En théorie, il n'y a pas de différence puisque les deux new TDest ()
y new TDest {}
vous fournira une instance de TDest
.
Cependant, lorsque vous utilisez l'expression d'initialisation, c'est parce que vous voulez définir les valeurs des propriétés ou des champs publics dans les fichiers TDest
.
class TDest
{
public string MyProperty { get; set; }
}
Vous pourriez donc initialiser le TDest
qui fixe une valeur à MyProperty
. Par exemple :
// Sample 1
new TDest { MyProperty = "This is the value of my property" };
// Sample 2
new TDest() { MyProperty = "This is the value of my property" };
Dans votre cas, votre classe a un constructeur sans paramètre, donc les deux, les ponctuateurs {, }
ou des opérateurs ()
serait bien.
Pour les scénarios simples où vous disposez d'un constructeur sans paramètre, vous pouvez utiliser uniquement la fonction TDest()
forme courte.
Mais si vous aviez par exemple la classe ci-dessous.
class TDest
{
readonly ISomeInterface _someService;
public string MyProperty { get; set; }
public TDest(ISomeInterface someService)
{
_someService = someService;
}
}
Et vous vouliez initialiser MyProperty
avec quelque chose de différent de sa valeur d'initialisation par défaut (null, types de référence), vous pouvez utiliser l'initialisation complète de l'objet. Par exemple :
// Sample 3
new TDest(new MySomeServiceImplementation()) { MyProperty = "This is the value of my property" };
J'espère que cela vous aidera !
Pour vous faire une meilleure idée, allez jeter un coup d'œil à Initialiseurs d'objets C# .
2 votes
Que voulez-vous dire par "ne fonctionne pas" ? Pouvez-vous fournir un peu de code pour illustrer ce qui se passe pendant le remaniement ? Pensez à ajouter un exemple minimal reproductible .
0 votes
Linqpad génère exactement le même IL, et logiquement il n'y aura pas de différence puisqu'ils font la même chose (appeler un constructeur sans paramètres, puis définir 0 propriété). Vous avez peut-être mal diagnostiqué votre problème. Comme d'autres l'ont dit, veuillez fournir un MVCE, et une explication claire de votre erreur.
4 votes
@RB non, le PO est correct - voir ma réponse.
7 votes
@ngeksyo IMO pas un dup dans ce cas - il y a une
Expression<T>
-une nuance spécifique en jeu ici0 votes
J'ai toujours pensé qu'il était 100% identique. Cela doit avoir un rapport avec l'expression. J'essaie d'ajouter un MCVE
7 votes
@cSteusloff ils sont identiques à 100%. en C# normal compilé en IL parce qu'il n'y a rien à faire à part créer l'objet ; cependant, sémantiquement ils sont différents, et le compilateur d'arbres d'expression essaie de conserver la sémantique que vous avez exprimée, qui était : un initialisateur d'objet sans affectations.
4 votes
" mon code ne fonctionne pas "n'est pas une bonne expression de la nature du problème. Obtenez-vous un message d'erreur en compilant le code ? Vous dites "mais les deux instances semblent égales", donc vous semblez dire que le code fonctionne et que les résultats sont identiques, mais alors qu'est-ce qui vous fait croire que votre code ne fonctionne pas ?