C # Cet initialiseur est-il vraiment redondant?

J’ai la ligne de code suivante:

var dmrReceived = new DownloadMessagesReport(); 

StyleCop et ReSharper suggèrent que je supprime l’initialiseur redondant. Cependant si je le remplace par

 DownloadMessagesReport dmrReceived; 

cela va sûrement générer une référence d’object non définie sur une instance d’object? J’utilise .NET 3.5. Ne devez-vous plus manuellement instancier des objects?

La ligne suivante est la suivante:

 dmrReceived = dc.DownloadNewMessages(param, param2, param3); 

Il est à noter que dc est une classe générée à partir d’un service WCF. Donc, DownloadNewMessages est une méthode de service Web WCF.

S’il s’agit d’un champ, il sera automatiquement initialisé à sa valeur par défaut – null pour un type de référence. Cependant, étant donné la var , je suppose que ce n’est pas le cas et que vous l’instanciez de plus en plus dans votre code, ce qui annule la valeur que vous avez instanciée ici. Vous n’avez pas besoin d’initialiser une variable où elle est déclarée. Si vous voulez utiliser var vous le faites, mais alors je vous recommande de le déclarer là où vous l’avez utilisé pour la première fois.

Donc, votre code est

 var dmrReceived = new DownloadMessagesReport(); dmrReceived = dc.DownloadNewMessages(param, param2, param3); 

La deuxième ligne ne remplit pas l’object que vous avez créé dans la première ligne, mais elle remplace complètement cet object. Donc, la première affectation n’est pas nécessaire (car le premier object n’est jamais utilisé), ce sur quoi R # met en garde.

Cela ne générera une erreur de référence d’object que si vous dmrReceived avant son affectation. Souvent, la raison pour laquelle le resharper dit qu’un initialiseur est redondant est que la variable se verra toujours atsortingbuer une autre valeur dans chaque chemin d’exécution possible.

c’est à dire

 DownloadMessagesReport dmrReceived; ... if(condition) { dmrReceived = new DownloadMessagesReport(); } else { throw new Exception("oh no"); } return dmrReceived.SomeProperty; 

L’access à SomeProperty est le premier endroit du code où dmrReceived doit avoir une valeur. Comme il découle du rest du code, il est impossible d’accéder à cette ligne de code sans lui atsortingbuer une valeur. Par conséquent, la valeur initiale éventuellement affectée ne serait utilisée dans aucun chemin d’exécution et serait donc redondante. .

“Ne devez-vous plus manuellement instancier des objects?”

Bien sûr, vous devez instancier “manuellement” des objects. Comment le compilateur peut-il savoir quand et où l’instancier autrement?

Un scénario simple est le suivant:

 MyType x; if ( EverythingWorkedOut ) x = new MyType(params); else x = null; 

Si le compilateur l’instanciait la première fois, il serait redondant et surchargé dans tout le code.

Ne faites pas confiance à ReSharper ou à d’autres ordinateurs intelligents pour votre propre instinct! Ils n’ont pas toujours raison, vous savez.

Juste une note de côté, vous n’avez pas vraiment besoin de faire x = null; puisqu’il devrait s’agir de la valeur par défaut d’un object non instancié.

Cela suffit sûrement?

 DownloadMessagesReport dmrReceived = dc.DownloadNewMessages(param, param2, param3); 

En supposant que ceci soit votre code:

 var dmrReceived = new DownloadMessagesReport(); dmrReceived = dc.DownloadNewMessages(param, param2, param3); 

Vous créez une instance de DownloadMessagesReport sur la première ligne. Et ensuite, vous jetez cet object en affectant à la variable dmrReceived une autre valeur renvoyée par la méthode DownloadNewMessages . Le premier new DownloadMessagesReport() object new DownloadMessagesReport() est redondant. Vous créez effectivement des déchets que Garbage Collector devra nettoyer à un moment donné.

C’est pourquoi ReSharper et StyleCop vous avertissent.

Si vous pouvez initialiser une variable avec la valeur réelle dans la même ligne que la variable, déclarez-le.