2010-04-28 12 views
5

Czy są jakieś koszty ogólne do stosując następujący sytax:C Deklaracje # obiektu

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

W przeciwieństwie do:

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

Kiedy uczyłem VB6, powiedziano mi robi quivelent w VB mieliśmy narzut - czy to samo dotyczy .NET?

Odpowiedz

5

Nie ma różnicy w .Net.

Ale w VB6 As New było złe. Miał on special meaning: utworzył zmienną automatyczną. Nigdy nie można uzyskać wyjątku odwołania zerowego dla tych zmiennych. Środowisko wykonawcze VB6 automatycznie utworzy dla ciebie nową instancję obiektu.

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 ' 

Takie zachowanie było considered evil przez większość programistów prawym myślenia, a my unikać As New jak ognia.

Ale w Vb.NET (i C#) nie ma różnicy między Dim x As New Foo i Dim x As Foo: Set x = New Foo

0

Wątpię, czy tak jest, ale nawet gdyby tak było, koszty ogólne wydajności byłyby tak znikome, że nie byłoby żadnej możliwej do uzyskania korzyści, wybierając jeden nad drugim.

1

W tym ostatnim przypadku oddzielono tylko deklarację od wystąpienia. Nie ma to znaczącego wpływu. Czytałem gdzieś, że tworzenie obiektów .Net trwa 0,000007 sekund, więc nie ma to większego znaczenia, ale zalecaną praktyką byłoby utworzenie instancji obiektu tylko wtedy, gdy jest to potrzebne i wyrzucenie, gdy nie jest potrzebne lub buforowanie nie jest wymagane.

+3

dobrze nie dokładnie - może chcesz zadeklarować obiekt przy wyższym zakresie i instancję-or-zbyć przedmiot na niektórych wydarzeń. W mojej aplikacji zachowuję odwołanie do obiektu okna prop-grid, który jest tworzony tylko wtedy, gdy użytkownik chce zobaczyć prop-grid. Pozbywam się obiektu prop-grid na zdarzenie close of prop-grid. –

+0

Zgadzam się z this._courious_geek. +1 –

2

Wynikowy kod bajtowy podczas kompilacji w trybie zwolnienia (i prawdopodobnie tryb debugowania) będzie taki sam.

0

W tym przykładzie utworzysz zmienną [myForm] typu Form1 i przydzielisz jej pamięć podczas tworzenia.

Form1 myForm = new Form1(); 

W tym przykładzie pierwsza linia tworzy zmienną typu Form1, ale dla tego obiektu myForm nie została przydzielona żadna pamięć.

Form1 myForm; 

Następnie druga linia może być stosowany, gdy trzeba nową instancję typu Form1 [w tym momencie, pamięć zostanie przydzielona dla obiektu MyForm].

myForm = new Form1(); 

Moim zdaniem, jest to naprawdę dobry zarażenia się wirusem HIV do deklarowania wszystkich zmiennych tam typów i wtedy, kiedy trzeba instancję żywo można zrobić ... obj = new foo1();