2010-04-28 14 views
5

¿Hay gastos generales para el uso de la siguiente sytax:Declaraciones en C# objetos

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

A diferencia:

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

Cuando estaba aprendiendo VB6, me dijeron que hace el quivelent en VB tenía una sobrecarga - ¿es lo mismo cierto en .NET?

Respuesta

5

No hay diferencia en .Net.

Pero en VB6 As New era malo. Tenía un special meaning: creó una variable de autoejecución. Nunca podría obtener una excepción de referencia nula con estas variables. El tiempo de ejecución de VB6 crearía automáticamente una nueva instancia del objeto para usted.

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 ' 

Este comportamiento fue considered evil por la mayoría de los programadores bienpensantes: y evitamos As New como de la peste.

Pero en VB.Net (y C#) no hay diferencia entre Dim x As New Foo y Dim x As Foo: Set x = New Foo

0

Dudo que exista, pero incluso si existiera, la sobrecarga del rendimiento sería tan insignificante que no habría ningún beneficio perceptible al elegir uno sobre el otro.

1

Solo ha separado la declaración de instanciación en este último caso. No hay un impacto significativo de esto. Leí en alguna parte que la instanciación de objetos .Net toma 0.000007 segundos por lo que apenas importa, aunque la práctica recomendada sería instanciar el objeto solo cuando sea necesario y eliminar cuando no sea necesario o no sea necesario el almacenamiento en caché ...

+3

bien no exactamente - es posible que desee declarar un objeto al alcance superior y una instancia-o-disponer el objeto en algunos eventos. En mi aplicación, mantengo una referencia de un objeto de la ventana de la cuadrícula prop que solo se crea una instancia cuando el usuario desea ver la cuadrícula prop. Dispongo el objeto de la grilla prop en un evento cercano de la forma de la grilla prop. –

+0

Estoy de acuerdo con esto._courious_geek. +1 –

2

Código resultante al compilar en modo de lanzamiento (y probablemente el modo de depuración) será el mismo.

0

En este ejemplo crea una variable [myForm] de tipo Form1 y asigna memoria al crearla.

Form1 myForm = new Form1(); 

En este ejemplo, la primera línea crea una variable de tipo Form1, pero no se ha asignado memoria para este objeto myForm.

Form1 myForm; 

A continuación, la segunda línea se puede utilizar siempre que lo necesite una nueva instancia de tipo Form1 [en ese punto, la memoria se asignarán para el objeto myForm].

myForm = new Form1(); 

En mi opinión, es realmente una buena pratice declarar todas las variables de tipos allí y luego, cuando se necesita un ejemplo vivo que puede hacer su ... obj = new foo1();

Cuestiones relacionadas