2009-04-04 12 views
3

Pour les tâches rapides où j'utilise seulement un objet instancié une seule fois, je suis conscient que je peux faire ce qui suit:Syntaxe d'instanciation anonyme - bonne ou mauvaise?

int FooBarResult = (new Foo()).Bar(); 

Je dis cela est tout à fait acceptable avec des objets non jetables et plus lisible que l'alternative:

Foo MyOnceUsedFoo = new Foo(); 
int FooBarResult = MyOnceUsedFoo.Bar(); 

Qui utilisez-vous et pourquoi?
Utiliseriez-vous ce type d'instanciation anonyme dans une application de production?
Préférence: avec des parenthèses "(new Foo()). Bar();" ou sans "new Foo(). Bar();"?

(sous la direction à la question abstraire de la classe au hasard)

Répondre

8

Side note au sujet des nombres aléatoires: En fait, non, votre exemple spécifique (new Random().Next(0,100)) est tout à fait inacceptable. Les nombres aléatoires générés seront loin d'être uniformes.


Autre que cela, en général, il n'y a pas beaucoup de différence entre les deux. Le compilateur générera probablement le même code exact dans les deux cas. Vous devriez aller avec le cas le plus lisible (les instructions longues peuvent nuire à la lisibilité, plus de code le fera aussi, donc vous devez faire le compromis dans votre cas spécifique). Par ailleurs, si vous choisissez d'aller avec le cas d'une seule ligne, omettez les parenthèses inutiles (new MyObject().Method() fera l'affaire).

+0

Il n'y a pas de distribution si vous générez un seul nombre aléatoire. Et si Random() a un mauvais comportement de démarrage à froid, vous n'obtenez aucun nombre uniforme de toute façon. –

+0

@danbruc: Techniquement, il y a une distribution, mais oui, j'ai compris. Tu as raison. Mais j'ai vu des développeurs utiliser cette méthode pour générer des nombres aléatoires dans une boucle plusieurs fois. Je pensais qu'il est assez important de le mentionner ici. –

+0

Ack complet sur cela - vous ne devriez même pas penser à générer plusieurs nombres de cette façon. –

3

Si vous n'utilisez l'objet qu'une seule fois, la première est meilleure en tout temps.

Il est plus court et plus clair, car il est explicite que vous n'utiliserez pas l'objet plus tard.

Il sera probablement compilé au même CIL de toute façon, donc il n'y a aucun avantage à la deuxième forme.

1

Première déclaration. C'est plus lisible, a moins de code et ne laisse pas de temps autour.

6

Vous pourriez envisager les implications de l'utilisation du code dans le débogueur. Le second cas vous permettra d'inspecter l'objet que vous avez créé, alors que le premier ne le fera pas. Accordé, vous pouvez toujours revenir au deuxième cas lorsque vous essayez de déboguer le code.

Je l'ai fait dans les deux sens et je n'ai pas vraiment de préférence. Je préfère tout ce qui semble plus lisible, ce qui dépend fortement de la complexité de la classe et de la méthode appelée.

BTW - vous pourriez vouloir choisir un autre exemple. Je crains que votre point puisse être perdu dans les discussions sur la meilleure façon de générer des nombres aléatoires.

+0

+1 En ce qui concerne le débogage - excellent point –

0

En fait, la première manière, la création d'un temporaire, est plus lisible pour deux raisons:

1), il est plus concis

Il y a moins de code à lire, il n'y a pas de variable locale introduit inutile, et

2) il communique quelque chose que la seconde forme ne fait pas, que l'objet est utilisé temporairement. En le lisant, je sais que cette instance ne sera jamais utilisée à nouveau, donc dans mon "compilateur mental" que j'utilise pour comprendre le code que je suis en train de lire, je n'ai pas besoin d'y faire référence pas plus que le code garde une référence à celui-ci. Comme le note Mehrdad, cependant, le faire avec une classe aléatoire n'est pas une bonne idée. Comme il le fait également remarquer, les parenthèses redondantes le rendent moins concis; à moins que vous ne soyez dans un coin poussiéreux d'une langue, supposons que les programmeurs compétents connaissent la priorité de l'opérateur de la langue. Dans ce cas, même si je ne connais pas la priorité de l'opérateur, l'analyse alternative (appel nouveau sur le retour d'une fonction) est absurde, donc la lecture "évidente" est la lecture correcte.

int RandomIndex = (new Random()).Next(0,100); 
int RandomIndex = new Random().Next(0,100); 
+0

Si la méthode prend un certain nombre de paramètres, la première option peut être moins lisible. La lisibilité ressemble beaucoup plus à la grammaire qu'aux mathématiques. Les règles sont généralement correctes, mais parfois, enfreindre une règle améliore le code. – tvanfosson

1

Le deuxième est débogage amical, tandis que le premier ne l'est pas. La deuxième gagne seulement à cause de cela.

Questions connexes