Seguimos a vueltas con algunas cuestiones de fundamentos relacionadas con la plataforma .NET...
Esta pregunta pregunta me la hizo hace poco un alumno del curso "Visual Studio desde cero". De hecho, dado que no es la primera vez que me lo preguntan, he pensado que podría ser útil a la comunidad, y por eso reproduzco aquí mi respuesta.
Consideremos por ejemplo esta estructura en C#:
public struct Punto
{
public int x, y;
}
O en VB:
Public Structure Punto
Public x, y As Integer
End Structure
Puedes declarar una variable que las use de dos formas diferentes: usando New o no. Por ejemplo en VB:
Dim p As Punto
Dim p As New Punto
¿Cuál es la diferencia?
A priori parece no haber ninguna. Sin embargo sí que la hay, y tiene que ver con extender las estructuras con propiedades y métodos.
A las estructuras se les puede añadir métodos, propiedades, etc.. como si fueran clases. Por ejemplo, consideremos el siguiente código en C#:
public struct Punto
{
int x, y;
public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
}
Si escribimos el siguiente código (el más habitual):
Punto p;
Console.WriteLine (p.X);
obtendremos un error que nos dice que la variable interna 'x' no está inicializada. Sin embargo, con este otro código:
Punto p = new Punto();
Console.WriteLine (p.x);
No se produciría error alguno.
Lo importante aquí es que, al ser declaradas por defecto (sin constructor), las estructuras no inicializan sus miembros internos, por lo tanto antes de usarlas debemos asignarles un valor.
Cada propiedad tiene un campo interno que no está inicializado cuando intentamos usarlo a través de la propiedad por primera vez, y obtendrías un error al hacerlo (no se sabe si tu propiedad antes de asignarlo intenta hacer algo con él y por lo tanto te obliga a tenerlo inicializado).
Si usas el constructor por defecto explícitamente (con la palabra clave new) lo que éste hace es inicializar todos los miembros internos a su valor por defecto, y a partir de ese momento ya te deja utilizarlos. Si no usas New no se llama al constructor por defecto y los campos están sin inicializar.