2010-04-28 5 views
5

Gibt es Gemeinkosten die folgende sytax zu verwenden:C# Objekt Erklärungen

Form1 myForm = new Form1(); 
myForm.Show(); 

Im Gegensatz zu:

Form1 myForm; 
myForm = new Form1(); 
myForm.Show(); 

Als ich VB6 lernte, wurde mir gesagt, macht die quivelent in VB eine hatte Overhead - ist das gleiche in .NET?

Antwort

5

Es gibt keinen Unterschied in .Net.

Aber in VB6 As New war böse. Es hatte eine special meaning: Es erstellt eine Auto-Instanziierungsvariable. Sie könnten niemals eine Null-Referenzausnahme mit diesen Variablen erhalten. Die VB6-Laufzeit erstellt automatisch eine neue Instanz des Objekts für Sie.

Dim x As New Foo 
x.Bar = 10  ' creates a new Foo ' 
Set x = Nothing ' destroys the first Foo' 
x.Bar = 20  ' NO ERROR - creates a second Foo ' 

Dieses Verhalten war considered evil von den meisten rechten Denken Programmierer: und wir vermieden As New wie die Pest.

Aber in VB.Net (und C#) gibt es keinen Unterschied zwischen Dim x As New Foo und Dim x As Foo: Set x = New Foo

0

Ich bezweifle, es gibt, aber selbst wenn es war, wäre der Leistungsaufwand so vernachlässigbar, dass es keinen erträglichen Nutzen geben würde, indem man einen über den anderen auswählt.

1

Sie haben im letzten Fall nur die Deklaration von der Instanziierung getrennt. Dies hat keine wesentlichen Auswirkungen. Ich lese irgendwo, dass. Net Objekt Instanziierung dauert 0,000007 Sekunden, so ist es kaum sinnvoll, obwohl die empfohlene Praxis wäre, das Objekt nur bei Bedarf zu instanziieren und zu entsorgen, wenn nicht benötigt oder Caching nicht erforderlich ..

+3

auch nicht genau - Sie könnten ein Objekt bei höheren Umfang erklären wollen und instanziiert-or-Entsorgung auf einige Ereignisse das Objekt. In meiner App behalte ich einen Verweis auf ein Prop-Grid-Fensterobjekt, das nur instanziiert wird, wenn der Benutzer das Prop-Grid sehen möchte. Ich setze das Prop-Grid-Objekt auf ein nahes Ereignis der Prop-Grid-Form. –

+0

Ich stimme dem zu._courious_geek. +1 –

2

Resultierende Bytecode beim Kompilieren im Freigabemodus (und wahrscheinlich Debug-Modus) wird gleich sein.

0

In diesem Beispiel erstellen Sie eine Variable [myForm] vom Typ Form1 und weisen ihr Speicher bei der Erstellung zu.

Form1 myForm = new Form1(); 

In diesem Beispiel wird die erste Zeile wird eine Variable vom Typ Form1, aber kein Gedächtnis hat für dieses Objekt myForm zugeordnet.

Form1 myForm; 

Dann wird die zweite Zeile kann verwendet werden, wenn Sie eine neue Instanz des Typs Form1 müssen [an diesem Punkt wird der Speicher für das myForm Objekt zugeordnet werden].

myForm = new Form1(); 

Meiner Meinung nach ist es wirklich eine gute pratice alle Ihre Variablen dort Typen zu deklarieren und dann, wenn Sie eine Live-Instanz benötigen, können Sie tun, um Ihre ... obj = new Foo1();