Debe tener en cuenta que si no proporciona un constructor sobrecargado, el compilador generará un constructor predeterminado para usted. Eso significa que, si sólo tiene
public class Foo
{
}
El compilador generará esto como:
public class Foo
{
public Foo() { }
}
Sin embargo, tan pronto como se agrega otro constructor
public class Foo
{
public Foo(int x, int y)
{
// ...
}
}
El compilador ya lo hará sin genere automáticamente el constructor predeterminado para usted. Si la clase ya se estaba utilizando en otro código que dependía de la presencia de un constructor predeterminado, Foo f = new Foo();
, ese código ahora se rompería.
Si no desea que alguien pueda inicializar la clase sin proporcionar datos, debe crear un constructor predeterminado que sea private
para ser explícito sobre el hecho de que está impidiendo que las instancias se construyan sin datos de entrada.
Hay veces, sin embargo, cuando es necesario proporcionar un constructor predeterminado (ya sea público o privado). Como se mencionó anteriormente, algunos tipos de serialización requieren un constructor predeterminado. También hay momentos en que una clase tiene múltiples constructores parametrizados pero también requiere inicialización de "nivel inferior", en cuyo caso se puede usar un constructor predeterminado privado que está encadenado desde los constructores parametrizados.
public class Foo
{
private Foo()
{
// do some low level initialization here
}
public Foo(int x, int y)
: this()
{
// ...
}
public Foo(int x, int y, int z)
: this()
{
// ...
}
}
Como de costumbre, solo cuando es necesario. –
Sí, también tengo curiosidad. Mi manager siempre me dice que es necesario para Reflection, pero no pude buscar nada al respecto, así que estoy un poco confundido. –