2010-06-03 21 views
52

Creo que no es obligatorio tener un constructor predeterminado en una clase (C#).Constructor vacío o sin constructor

Entonces, en esa situación, ¿tendré un constructor vacío en la clase o puedo omitirlo?

¿Es una buena práctica tener un constructor predeterminado vacío?

Class test 
{ 
    public test() 
    { 

    } 
     ...... 
} 

o

Class test 
{ 
     ...... 
} 

Respuesta

56

Si la clase no será utilizada por terceros y no necesita un constructor sobrecargado, no escriba un constructor vacío.

Pero ...

Imagínese que ya envié el producto, y terceros utilicen la clase. Unos meses más tarde hay un nuevo requisito que te hace agregar un constructor con un argumento.

Ahora, al hacerlo, el compilador de C# ya no genera un constructor predeterminado. Si no agrega un constructor vacío explícitamente, el código de terceros se romperá.

En mi opinión, siempre debe definir constructores vacíos (un trazador de líneas) para las clases públicas utilizadas por terceros.

+3

En otro tema, si quiere usar su clase .NET en un programa COM, se creará un constructor público no-args requerido, por las mismas razones que explicó Soe Moe, lo pondría explícitamente en la clase. –

+7

Podría argumentar que sus propias pruebas unitarias deberían fallar si va a romper clientes de terceros de esta manera. – Jon

+0

A veces simplificando su enfoque al usar habitualmente un cierto patrón está bien. Es mi razón para usar los puntos y comas de Javascript (porque no quiero recordar cuándo son necesarios y cuándo están desordenados). Sin embargo, creo que en este caso confiaría en las pruebas unitarias para detectar errores en lugar de colocar constructores vacíos en todas partes. Preferencia personal, supongo. De todos modos, esta respuesta es excelente ya que expone la lógica de por qué uno preferiría agregar explícitamente constructores vacíos. – aaaaaa

32

KISS - Si la clase no tiene que hacer nada en el constructor por defecto - no lo definen. El compilador generará uno para ti.

Desde el horse's mouth:

A menos que la clase es estática, sin clases constructores se les da un constructor público predeterminado por el compilador de C# con el fin de permitir a la clase de instancias.

+3

Para aclarar: Si su clase * does * tiene al menos un constructor que tiene uno o más parámetros, entonces el compilador C# * no * creará un constructor predeterminado para usted. En ese caso, * puede * querer crear explícitamente un constructor predeterminado, incluso si no hace nada (es decir, está vacío). (Consulte la respuesta aceptada y otros para obtener más información.) – DavidRR

2

Por defecto, C# agregará un constructor de cero parámetros para usted. Así que no agregue uno si no tiene algo especial que hacer allí.

Tendrá que agregar cualquier constructor vacío usted mismo, incluso sin código, si tiene otro constructor con parámetros y desea mantener vivo el constructor sin parámetros.

Otro escenario en el que quiera añadir un constructor sin parámetros vacía es si desea cambiar su modificador de acceso del público a otra cosa (privado, protegido o interna)

2

El compilador de C# creará el valor por defecto constructor para usted, por lo que no debe escribir uno sin parámetros, con un cuerpo vacío.

+0

Los codificadores de experiencia me han dicho que no tenerlos les ha causado problemas en el futuro, p. clases estáticas – Coops

1

Dont escribir un constructor vacío que se crea de forma predeterminada

8

There's nothing like default constructors. Es un constructor público sin parámetros en C#. El compilador de C# buscará constructores en una clase mientras compila y agregará un constructor público sin parámetros si no se definen constructores. Así que está bien omitir la definición de un constructor si los objetos de su clase no necesitan ninguna operación especial para la construcción.

En segundo lugar, si define un constructor con parámetro, el compilador no agregará un constructor público sin parámetros porque el compilador supondrá que sus objetos deben construirse a través del constructor que ha definido. Una vez dicho esto, debe definir explícitamente un constructor sin parámetros si tiene al menos un constructor parametrizado, si necesita que sus objetos se construyan con constructor de parámetros.

También puede tener un constructor privado sin parámetros, que es fundamental para crear clases singleton.

2

Las únicas veces que incluiría un constructor sin parámetros vacío es si quiero que el constructor sea privado o si quiero que un constructor sin parámetros llame a otra sobrecarga con nulo como parámetro. Por cierto, en su ejemplo anterior ha hecho privado el constructor de Test al no especificar public.

class Foo 
{ 
    public Foo() 
     : this(null) 
    { 
    } 

    public Foo(string bar) 
    { 
     if (bar != null) 
     { 
      Console.WriteLine(bar); 
     } 
    } 
} 
+0

He modificado el código. – Ram

+0

OK, la razón por la que lo noté es porque un constructor privado puede ser útil para forzar a los usuarios de su clase a usar cualquier método de fábrica que decida incluir en su clase. Por ejemplo, mi clase Foo podría tener un método de fábrica Foo CreateFoo() público estático y ningún constructor público ... – Nate

5

Si no necesita un constructor sin parámetros, no agregue uno con un cuerpo vacío. Sin embargo, si alguien quiere serializar/deserializar objetos de su clase, entonces necesitará un constructor sin parámetros.

Si no define constructores, el compilador generará automáticamente un parámetro sin parámetros para usted, pero no lo hará si usted mismo define un constructor.

Dicho sea de paso, puede suprimir el constructor predeterminado generado automáticamente del compilador de C# definiendo un constructor privado vacío.

Cuestiones relacionadas