Avec mon code, je reçois 3 messages, tous disant object initialization can be simplified
et, dans ma soif de connaissances (et mon TOC) de plus en plus importante, je voudrais "réparer" mon code afin que ces messages n'apparaissent pas. Je sais que je peux simplement le régler pour que ces messages ne s'affichent pas, mais j'aurai toujours dans la tête qu'ils sont là-bas à l'arrière-plan, ce qui ne m'assoit pas. Si quelqu'un pouvait indiquer comment "simplifier l'initialisation", ce serait formidable pour que je puisse améliorer mes compétences. Si plus de code est requis, faites-le moi savoir et je pourrai l'ajouter au format.
1er:
TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);//issue on this line
node.Tag = drive;
2nd:
DirectoryInfo di = new DirectoryInfo(dir);
TreeNode node = new TreeNode(di.Name, 0, 1); //this line
Je soupçonne que c'est avec les nuanciers parce que je leur ai donné le même nom mais j'ai essayé de changer de nom, mais cela n'a pas changé.
ème:
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
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
};
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);
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) - ce qui ouvre "quick-Fix/quick-refactor"
Pour en savoir plus sur var (ce n’est vraiment pas le mal ????) et d’autres documents sur Initialiseurs d'objets et de collections
Bien que toutes les suggestions précédentes soient également bonnes, j’ajouterais une troisième manière. Désactivez ces avertissements et ignorez-les. Bien que j'apprécie les efforts de Microsoft pour obtenir un codage efficace et net par tout le monde, ce n'est pas une bonne suggestion à mon avis et cela produit en réalité un code difficile à lire et à modifier.
Tout d'abord, cela transforme essentiellement l'initialisation de l'objet en une seule ligne de code et les erreurs éventuelles sont signalées en tant que telles. Si vous avez chargé 20 bits de données dans un objet, une erreur apparaît sur la première ligne sans indiquer la propriété erronée. Le débogage ne vous aidera pas car le bloc entier de code s'affiche comme une erreur.
Deuxièmement, si à l'avenir vous devez développer le code et ajouter du code supplémentaire pour une propriété spécifique, vous devez le faire dans un code séparé. Cela ajoute à la fragmentation et sépare les bits de code associés (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. Afin de placer votre initialisation entre crochets, vous avez rendu le code plus difficile à déboguer et à modifier. C'est un mauvais compromis à mon avis.
Vous pouvez désactiver l'avertissement en cliquant dessus avec le bouton droit de la souris et en sélectionnant "Supprimer", ou allez dans Outils> Options> Editeur de texte> C #> Style de code> Général> Préférer l'initialiseur d'objets> et définissez l'avertissement sur Aucun, ou définissez Préférence sur Non.
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 ... pour désactiver le message d'avertissement (IDE0017) (dans VS 2017/2019):
Clique le Tools Languette. Puis descendre à Options...
Alors TextEditor | C # | CodeStyle | Général
Sous Préférences Expressoin modifier Préférer l'initialiseur d'objet à Non.
Vous pouvez également laisser la préférence sous la forme Yes et modifier la gravité de Warning à Suggestion. Maintenant, il va simplement montrer comme un message dans la liste des erreurs.
J'aime @ tonyenkiducx answer , mais je me sens comme s'il y avait quelques 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. Dans le propgramme orienté objet, définir des propriétés l'une après l'autre peut 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 conduira à une application logicielle améliorée globalement, car vous augmentez sa cohésion.
Les messages object initialization can be simplified
peuvent être utiles pour détecter les points de votre code où vous pouvez utiliser un modèle de création , en cas de violation de l'encapsulation:
Cela nous permet de répondre aux préoccupations exprimées par @ tonyenkiducx :
Tout d'abord, cela transforme essentiellement l'initialisation de l'objet en une seule ligne de code et les erreurs éventuelles sont signalées en tant que telles. Si vous avez chargé 20 bits de données dans un objet, une erreur apparaît sur la première ligne sans indiquer la propriété erronée. Le débogage ne vous aidera pas car le bloc entier de code s'affiche comme une erreur.
Deuxièmement, si à l'avenir vous devez développer le code et ajouter du code supplémentaire pour une propriété spécifique, vous devez le faire dans un code séparé. Cela ajoute à la fragmentation et sépare les bits de code associés (peut-être, c'est discutable).
Par conséquent, au lieu d'inclure l'instanciation au moment où l'objet est consommé, comme le suggère souvent Visual Studio, je vous suggère d'utiliser un modèle de création. Cela ne supprimera peut-être pas le message de simplification, mais à ce stade, vous avez réfléchi à cet indicateur de message et pouvez le supprimer en toute sécurité.
Le compilateur veut que vous utilisiez la syntaxe suivante:
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.