l'initialisation d'objet peut être simplifiée

Avec mon code, je reçois 3 messages disant Tous {[3] } et dans ma soif toujours croissante de connaissances (et Mon Toc), je voudrais "réparer" mon code pour que ces messages n'apparaissent pas. Je sais que je peux simplement le définir pour que ces messages n'apparaissent pas, mais j'aurai toujours dans ma tête qu'ils sont là en arrière-plan qui ne marche pas s'asseoir avec moi. Si quelqu'un peut nous montrer comment "simplifier l'initialisation" ce serait génial si je peux améliorer mes compétences. Si plus de code est requis faites le moi savoir et je peux ajouter il en.

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 avec les treenodes que c'est parce que je leur ai donné le même nom mais 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);
26
demandé sur WhatsThePoint 2017-04-25 12:01:33

5 réponses

1er

Avant de:

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 de:

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 de chaîne):

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

BTW: chaque fois que ce type de message apparaît, essayez de placer le curseur sur cette ligne et appuyez sur Ctrl+. (ou cliquez sur l'ampoule qui apparaît) - qui ouvre "Quick-Fix / quick-refactor"

Plus de lecture sur var (c'est vraiment pas mal ) et un peu plus de documentation sur initialiseurs D'objets et de collections

33
répondu earloc 2018-04-13 17:54:18

Bien que toutes les suggestions précédentes soient également bonnes, j'ajouterais une troisième façon. 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 du code difficile à lire et à modifier.

Tout d'abord, cela transforme essentiellement l'initialisation de l'objet en une seule ligne de code, et toutes les erreurs sont signalées comme telles. Si vous aviez 20 bits de données en cours de chargement dans un objet vous seriez présenté avec une erreur sur la première ligne et ne pas dire quelle propriété a commis une erreur. Le débogage n'aidera pas car on vous montre tout le bloc de code comme erreur.

Deuxièmement, si vous devez à l'avenir développer le code et 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 les bits de code connexes (peut-être, c'est discutable).

Ces deux problèmes peuvent sembler très mineurs, mais l'avertissement suggère un correctif qui est également une chose très mineure. Par souci de bracketing votre initialisation, 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 sur l'avertissement et en sélectionnant "Supprimer", ou allez dans Outils > Options > Éditeur de texte > Style de Code > Général > initialiseur D'objet préféré > et définissez L'avertissement sur aucun.

25
répondu Tony Cheetham 2017-08-14 11:17:57

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 résolu avec ce code:

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

Sooo...to désactivez le message D'avertissement (IDE0017) (dans VS 2017):
Cliquez sur L'ongletoutils . Ensuite, descendez à Options...
Alors / TextEditor / C# / CodeStyle / Général /
En vertu de Expressoin préférences modifier Préfèrent Initialiseur d'Objet à Non.

5
répondu Chris Catignani 2017-12-11 15:51:09

Je suppose que ces messages veulent juste que vous utilisiez la syntaxe floowing:

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

Ceci est pour votre 3ème cas.

2
répondu Serraniel 2017-04-25 09:07:04

J'aime @tonyenkiducx répondre , mais j'ai l'impression qu'il y a des idées plus grandes qui devraient être discutées.

D'après mon expérience, les suggestions de refactor fournies par Visual Studio ne sont pas utiles. Je pense que la plus grande question à 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 tout membre est accessible / appelé jusqu'au moment où l'objet est détruit. Dans ce cas, l'État doit être valide après que chaque propriété est définie. Une bonne encapsulation conduira à une application logicielle globale améliorée parce que vous augmentez sa cohésion.

Les messages object initialization can be simplified peuvent être utiles pour détecter des points dans votre code où vous pouvez utiliser un modèle de création , en cas de violation de l'encapsulation:

  • motif D'usine abstrait
  • constructeur motif
  • modèle de méthode D'usine
  • modèle Prototype

Cela nous permet de répondre aux préoccupations soulevées par @tonyenkiducx :

Tout d'abord, cela transforme essentiellement l'initialisation de l'objet en une seule ligne de code, et toutes les erreurs sont signalées comme telles. Si vous aviez 20 bits de données en cours de chargement dans un objet, une erreur vous serait présentée sur la première ligne et ne vous indiquerait pas quelle propriété a commis une erreur. Le débogage n'aidera pas comme vous l'êtes montré le bloc entier de code comme l'erreur.

Deuxièmement, si vous devez à l'avenir développer le code et 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 les bits de code connexes (peut-être, c'est discutable).

Donc, au lieu d'intégrer l'instanciation au point où l'objet est consommé, ce qui est souvent suggéré par Visual Studio, je vous suggère d'utiliser un modèle de création. Cela peut ne pas supprimer le message de simplification, mais à ce stade, vous avez soigneusement considéré cet indicateur de message et pouvez le supprimer en toute sécurité.

2
répondu Nick Miller 2018-02-20 15:25:17