51 votes

l'initialisation des objets peut être simplifiée

Avec mon code, je reçois 3 messages qui disent tous object initialization can be simplified et dans ma soif toujours croissante de connaissances (et mes TOC), je voudrais "réparer" mon code pour que ces messages n'apparaissent pas. Je sais que je peux simplement faire en sorte que ces messages n'apparaissent pas, mais j'aurai toujours en tête qu'ils sont là en arrière-plan, ce qui ne me convient pas. Si quelqu'un peut m'indiquer comment "simplifier l'initialisation", ce serait formidable pour que je puisse améliorer mes compétences. Si vous avez besoin de plus de code, faites-le moi savoir et je pourrai l'ajouter.

1er :

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);//issue on this line
node.Tag = drive;

2ème :

DirectoryInfo di = new DirectoryInfo(dir);
TreeNode node = new TreeNode(di.Name, 0, 1); //this line

Je soupçonne qu'avec les treenodes, c'est parce que je leur ai donné le même nom. J'ai essayé de changer le nom mais cela n'a pas fait de différence.

3ème :

OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);

6 votes

Pour la curiosité et la volonté d'améliorer les compétences +1 ;)

79voto

Tony Cheetham Points 623

Bien que toutes les suggestions précédentes soient également bonnes, j'ajouterais une troisième voie. Désactivez ces avertissements et ignorez-les. Bien que j'apprécie les tentatives de Microsoft pour que tout le monde code efficacement et proprement, ce n'est pas une bonne suggestion à mon avis et cela produit en fait un code difficile à lire et à éditer.

Tout d'abord, cela transforme l'initialisation des objets en une seule ligne de code, et toute erreur est signalée comme telle. Si 20 bits de données étaient chargés dans un objet, une erreur serait présentée dès la première ligne, sans que l'on sache quelle propriété est erronée. Le débogage n'est d'aucune utilité, car le bloc de code entier est présenté comme l'erreur.

Deuxièmement, si vous avez besoin à l'avenir d'étendre le code et d'ajouter du code supplémentaire pour une propriété spécifique, vous devrez maintenant le faire dans un code séparé. Cela ajoute à la fragmentation et sépare des morceaux de code connexes (peut-être, c'est discutable).

Ces deux problèmes peuvent sembler très mineurs, mais l'avertissement suggère une solution qui est également très mineure. Pour le plaisir de mettre votre initialisation entre parenthèses, vous avez rendu votre code plus difficile à déboguer et à modifier. C'est un mauvais compromis à mon avis.

Vous pouvez désactiver l'avertissement en cliquant avec le bouton droit de la souris sur l'avertissement et en sélectionnant "supprimer", ou aller dans Outils > Options > Éditeur de texte > C# > Style de code > Général > Préférer l'initialisateur d'objet > et définir l'avertissement sur Aucun, ou définir la préférence sur Non. settings to change preference for object initializers

2 votes

J'ai mentionné dans ma question que je ne voulais pas désactiver les messages.

18 votes

Je ne m'attends pas à des votes, mais je voulais laisser ce message à tous ceux qui tombent sur la solution car elle est apparue pour moi comme le premier résultat :)

2 votes

Merci, cela m'a beaucoup aidé. J'ai fini par changer "Préférence" en "Non", plutôt que de changer "Gravité" en "Suggestion" afin d'obtenir des suggestions lorsque le code ne correspond pas à l'opposé de la valeur par défaut.

47voto

earloc Points 1479

1er

Avant :

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);
node.Tag = drive;

Après :

var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};

2ème

Avant :

DirectoryInfo di = new DirectoryInfo(dir);
TreeNode node = new TreeNode(di.Name, 0, 1); //this line

Après :

var node = new TreeNode((new DirectoryInfo(dir)).Name, 0, 1);

3ème

Avant :

OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})",
      strSQL2);

Après :

var select = new OleDbCommand(
      String.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2), 
      cnDTC);

3ème (avec interpolation des cordes) :

var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);

BTW : à chaque fois que ce genre de message apparaît, essayez de mettre le curseur sur cette ligne et appuyez sur Ctrl + . (ou cliquez sur l'ampoule qui apparaît) - ce qui ouvre la fenêtre "quick-Fix / quick-refactor".

Plus d'informations sur var (il n'est vraiment pas mauvais) et un peu plus de documentation sur Initialisateurs d'objets et de collections

3 votes

Merci, mais je ne sais pas pourquoi var est plus simple que de donner son type parce que, d'après ce que j'ai compris. var est utilisé pour les différents types ?

7 votes

Non, absolument pas, allez-y et lisez l'article lié, c'est juste un "raccourci". (Essayez de placer le curseur de la souris sur une déclaration de var, cela vous donnera le type exact déduit. var != variant ! !!! :)

0 votes

Et btw, vous ouvrez votre application à l'injection sql en utilisant string.Format. ^^ > fr.wikipedia.org/wiki/SQL_injection

13voto

Chris Catignani Points 11

J'ai eu un problème similaire avec ce code :

        Customer oCust = new Customer();
        oCust.Address = txtAddress.Text;
        oCust.City = txtCity.Text;
        oCust.State = txtState.Text;

Et je l'ai résolu avec ce code :

        Customer oCust = new Customer()
        {
           Address = txtAddress.Text,
           City = txtCity.Text,
           State = txtState.Text
        };

Donc...pour désactiver le message d'avertissement (IDE0017)(dans VS 2017/2019) :
Cliquez sur le bouton Tools Tab. Ensuite, allez à Options...
Puis | Éditeur de texte | C# | CodeStyle | Général |
Sous Préférences de l'Expressoin changement Initialisateur d'objets préférés a Non .

Vous pouvez également laisser la préférence à Oui et changez la gravité de Warning à Severity Suggestion .
Maintenant, il s'agit d'un message dans la liste des erreurs.

0 votes

Je l'obtiens sur tout ce qui a de multiples propriétés qui lui sont assignées, il veut juste mettre des crochets autour de tout.

6voto

Nick Miller Points 353

J'aime Réponse de @tonyenkiducx mais j'ai l'impression qu'il y a des idées plus larges qui devraient être discutées.

D'après mon expérience, les suggestions de refactorisation fournies par Visual Studio ne sont pas utiles. Je pense que la question la plus importante à considérer est de savoir si la conception du code est correcte ou non. Dans la programmation orientée objet, définir les propriétés les unes après les autres mai violer l'encapsulation. L'idée est que l'objet doit toujours être dans un état valide après l'accès/appel d'un membre jusqu'au moment où l'objet est détruit. Dans ce cas, l'état doit être valide après la définition de chaque propriété. Une encapsulation correcte permet d'améliorer l'application logicielle dans son ensemble, car vous en augmentez la cohérence.

El object initialization can be simplified peuvent être utiles pour détecter les points de votre code où vous pouvez utiliser une fonction Modèle de création dans le cas où l'encapsulation est violée :

  • Modèle de fabrique abstraite
  • Motif de construction
  • Modèle de méthode d'usine
  • Modèle de prototype

Cela nous permet de répondre aux préoccupations exprimées par les personnes suivantes @tonyenkiducx :

Tout d'abord, cela transforme essentiellement l'initialisation des objets en une seule ligne de code, et toute erreur est signalée comme telle. Si 20 bits de données étaient chargés dans un objet, une erreur serait présentée dès la première ligne, sans que l'on sache quelle propriété est erronée. Le débogage n'est d'aucune utilité, car le bloc de code entier est présenté comme l'erreur.

Deuxièmement, si vous avez besoin à l'avenir d'étendre le code et d'ajouter du code supplémentaire pour une propriété spécifique, vous devrez maintenant le faire dans un code séparé. Cela ajoute à la fragmentation et sépare des morceaux de code connexes (peut-être, c'est discutable).

Ainsi, au lieu d'intégrer l'instanciation au moment où l'objet est consommé, ce que Visual Studio suggère souvent, je vous suggère d'envisager d'utiliser un pattern de création. Cela ne supprimera peut-être pas le message de simplification, mais à ce stade, vous avez réfléchi à ce drapeau de message et pouvez le supprimer en toute sécurité.

2voto

Serraniel Points 146

Le compilateur vous demande d'utiliser la syntaxe suivante :

var select = new OleDbCommand
{
   Connection = cnDTC,
   CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2)
};

C'est pour votre 3ème affaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X