2010-01-08 6 views
2

J'ai la ligne de code suivante:C# Cet initialiseur est-il réellement redondant?

var dmrReceived = new DownloadMessagesReport(); 

StyleCop et ReSharper suggérez-je supprimer l'initialiseur redondant. Toutefois, si je le remplace par

DownloadMessagesReport dmrReceived; 

sûrement cela va générer une référence d'objet non définie à une instance d'un objet? J'utilise .NET 3.5. Ne devez-vous plus instancier manuellement des objets?

ligne suivante qui suit est:

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

Il convient de 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.

+0

Quel est le reste du code pour cette méthode? –

Répondre

12

S'il s'agit d'un champ, il sera automatiquement initialisé à sa valeur par défaut - null pour un type de référence. Étant donné le var cependant, je suppose que ce n'est pas le cas, et que vous êtes en train de l'instancier plus bas dans votre code de toute façon, rejetant ainsi 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'utilisez en premier.

+0

Ok, c'est logique, merci David. –

1

"Ne devez-vous plus manuellement instancier des objets?"

Bien sûr, vous devez instancier des objets "manuellement", comment le compilateur pourrait-il savoir quand et où l'instancier?

Un scénario est simple:

MyType x; 

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

Si le compilateur instanciée la première fois, il serait redondant et plus de frais généraux dans l'ensemble du code. Ne faites pas confiance à ReSharper ou à toute autre machine intelligente sur vos propres instincts! Ils n'ont pas toujours raison, tu sais.

Juste une note de côté, vous n'avez pas vraiment besoin de faire x = null; depuis il devrait être la valeur par défaut d'un objet non-instancié.

+0

Downvoter peut s'il vous plaît laisser un commentaire :) –

2

Cela ne générera une erreur de référence d'objet que si dmrReceived est accédé avant d'être affecté. Dans la plupart des cas, la raison pour laquelle le gestionnaire de resharper dit qu'un initialiseur est redondant est que la variable recevra toujours une autre valeur dans chaque chemin d'exécution possible.

à savoir

DownloadMessagesReport dmrReceived; 

... 

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

return dmrReceived.SomeProperty; 

Accès SomeProperty est la première place dans le code où dmrReceived a réellement besoin d'avoir une valeur. Comme suit du reste du code, il n'y a aucun moyen d'accéder à cette ligne de code sans lui affecter une valeur, donc, la valeur initiale qui aurait pu être assignée, ne serait pas utilisée dans un chemin d'exécution, et serait donc redondante .

+0

(ce n'est pas quelque chose de nouveau à 3,5 btw) –

6

Ainsi, votre code est

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

La deuxième ligne n'a pas remplir l'objet que vous avez créé dans la première ligne, mais complètement REMPLACE cet objet. Donc, la première assignation n'est pas nécessaire (puisque le premier objet n'est jamais utilisé), ce que R # avertit.

0

Sûrement cela suffit?

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

ceci est votre Supposant code:

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

Vous créez une instance d'un DownloadMessagesReport dans la première ligne. Et puis vous jetez cet objet en affectant à la variable dmrReceived une autre valeur renvoyée par la méthode DownloadNewMessages. Le premier objet 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 sur la même ligne où la variable est déclarée, faites-le.