2009-04-04 15 views
3

Für schnelle Aufgaben, bei denen ich ein instanziiert Objekt nur einmal verwenden, ich bin mir bewusst, dass ich folgendes tun:Anonyme Instantiierungssyntax - gut oder schlecht?

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

Ich sage das durchaus akzeptabel mit Nicht-Einweg-Objekten ist und besser lesbar als die Alternative:

Welche verwenden Sie und warum?
Würden Sie diese Art der anonymen Instanziierung jemals in einer Produktions-App verwenden?
Vorzug: mit Klammern "(neu Foo()). Bar();" oder ohne "new Foo(). Bar();"?

(Herausgegeben von Zufall Klasse abstrakte Frage weg)

Antwort

8

Exkurs über Zufallszahl: In der Tat, nein, Ihr konkretes Beispiel (new Random().Next(0,100)) völlig inakzeptabel ist. Die generierten Zufallszahlen werden nicht einheitlich sein.


Abgesehen davon gibt es im Allgemeinen keinen großen Unterschied zwischen den beiden. Der Compiler wird wahrscheinlich in beiden Fällen den exakt gleichen Code generieren. Sie sollten mit dem am besten lesbaren Fall fortfahren (lange Anweisungen können die Lesbarkeit beeinträchtigen; mehr Code wird dies auch tun, so dass Sie in Ihrem speziellen Fall Kompromisse eingehen müssen).

Übrigens, wenn Sie sich entschieden haben, mit der Ein-Zeilen-Fall zu gehen, lassen Sie die unnötigen Parens (new MyObject().Method() wird tun).

+0

Es gibt keine Verteilung, wenn Sie nur eine Zufallszahl generieren. Und wenn Random() ein schlechtes Kaltstartverhalten hat, erhält man keine einheitlichen Zahlen. –

+0

@danbruc: Technisch gibt es eine Verteilung, aber ja, ich verstehe Ihren Standpunkt. Du hast recht. Aber ich habe gesehen, Entwickler verwenden diese Methode, um Zufallszahlen in einer Schleife mehrmals zu generieren. Ich dachte, es ist ziemlich wichtig, es hier zu erwähnen. –

+0

Volle Antwort darauf - Sie sollten nicht einmal daran denken, auf diese Weise mehrere Zahlen zu generieren. –

3

Wenn Sie das Objekt nur einmal verwenden, ist der erste Weg immer besser.

Es ist kürzer und klarer, weil es explizit macht, dass Sie das Objekt später nicht verwenden werden.

Es wird wahrscheinlich auf die gleiche CIL trotzdem kompilieren, so gibt es keinen Vorteil für die zweite Form.

1

Erste Aussage. Es ist lesbarer, hat weniger Code und lässt keine Temps herum.

6

Sie könnten die Auswirkungen der Verwendung des Codes im Debugger berücksichtigen. Der zweite Fall ermöglicht es Ihnen, das von Ihnen erstellte Objekt zu überprüfen, während der erste nicht. Zugegeben, Sie können immer zum zweiten Fall zurückkehren, wenn Sie versuchen, den Code zu debuggen.

Ich habe es in beide Richtungen getan und habe keine Vorliebe. Ich bevorzuge, was lesbarer aussieht, was stark von der Komplexität der aufgerufenen Klasse und Methode abhängt.

BTW - Sie möchten vielleicht ein anderes Beispiel auswählen. Ich befürchte, dass Ihr Standpunkt in Diskussionen über die beste Art, Zufallszahlen zu generieren, verloren gehen könnte.

+0

+1 Zum Debuggen - ausgezeichneter Punkt –

0

In der Tat der erste Weg, einen temporären erstellen, ist lesbare aus zwei Gründen:

1) es ist prägnantes

Es gibt weniger Code zu lesen, gibt es keinen unnötigen lokalen Variable eingeführt, und Kein potentieller Name kollidiert mit einem anderen lokalen oder Shadowing einer Variablen mit demselben Namen in einem umschließenden Scope

2) es kommuniziert etwas, dass die zweite Form nicht, dass das Objekt vorübergehend verwendet wird.

Wenn ich es lese, weiß ich, dass diese Instanz nie wieder benutzt wird, also muss ich in meinem "mentalen Compiler", den ich benutze, um den Code zu verstehen, den ich gerade lese, keinen Verweis darauf Mehr als der Code enthält einen Verweis darauf.

Wie Mehrdad bemerkt, ist es jedoch keine gute Idee, es mit einer Random-Klasse zu tun.

Wie er auch bemerkt, machen die überflüssigen Klammern es weniger prägnant; Wenn Sie sich nicht in einer staubigen Ecke einer Sprache befinden, nehmen Sie an, dass kompetente Programmierer die Vorrangstellung der Sprache kennen. In diesem Fall, auch wenn ich die Vorrangstellung des Operators nicht kenne, ist die alternative Syntaxanalyse (Neuaufruf bei der Rückkehr einer Funktion) unsinnig, so dass das "offensichtliche" Lesen das korrekte Lesen ist.

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

Wenn die Methode eine angemessene Anzahl von Parametern benötigt, ist die erste Option möglicherweise weniger lesbar. Lesbarkeit ist viel mehr wie Grammatik als Mathematik. Die Regeln sind normalerweise korrekt, aber manchmal macht das Brechen einer Regel einen besseren Code. – tvanfosson

1

Der zweite ist Debugging freundlich, während der erste nicht ist. Der zweite gewinnt nur deshalb.

Verwandte Themen