2010-05-20 31 views
39

¿Hay alguna manera de evitar el uso del constructor predeterminado?Impedir el uso del constructor predeterminado

Todo lo que puedo pensar es lanzar una excepción, pero me gustaría algo que provoque un error de tiempo de compilación.

+3

es posible que encuentre problemas si se hace esto: (./Serialización/etc unión) en .NET un constructor sin parámetros por defecto es necesaria para una serie de cosas. Considere tener valores predeterminados para cualquier valor que necesite establecer a través de parámetros de constructor. Esto puede no importar en su caso, pero vale la pena mencionarlo. –

Respuesta

80
  • Si todo en la clase es estático, considere convertirlo en una clase estática. De esta forma, no obtendrás un constructor en absoluto.
  • Si quieres un constructor sin parámetros, pero no quiere que sea pública, declaran explícitamente y que sea privada (o interna, etc.)
  • Si no desea que un constructor sin parámetros, pero hacen quieren constructores con los parámetros, a continuación, sólo declarar los - el constructor por defecto no se generará para usted

I piensa que debe cubrir todas las bases ...

+0

Dijiste casi exactamente lo que estaba escribiendo :) – Joel

+0

Desearía saber sobre clases estáticas hace mucho tiempo. – luiscubal

+1

a menos que sea una estructura y no una clase. Si este es el caso, se genera el ctor predeterminado (algo bueno para que todos los accesorios se inicialicen) pero invocable (desafortunadamente) - es decir, quiero forzar al usuario a usar el ctor con params. –

35

Hazlo privado.

Así,

class SomeClass 
{ 
    private SomeClass() 
    { 
    } 

    public SomeClass(int SomeParam) 
    { 
    } 
} 
+0

+1 para ir al grano. – corsiKa

+9

A menos que lo necesite dentro del tipo (o tipos anidados) puede eliminarlo por completo aquí; solo se generará si no se declaran explícitamente constructores. –

+0

@Jon Normalmente soy un tipo de cinturón y tirantes, así que normalmente lo haría de esta manera; de esa manera lo que intento hacer es claro para cualquiera que lo mire. Es bueno saber que el compilador lo maneja automáticamente, sin embargo, si lo olvido. –

8

Usted sólo puede hacerlo privado:

private MyClass() 
{ 
} 

alternativa (si usted no lo sabía ya) si sólo se declara un constructor con parámetros, la opción por defecto ISN No agregado por el compilador, por ej.

private MyClass(string myParameter) 
{ 
    //Can't call new MyClass() anymore 
} 
5

Una cosa para mencionar que otros no tienen. El constructor predeterminado aún debería poder configurar los bits de implementación predeterminados para evitar la reutilización. Esto no es un problema si es privado, ya que aún puede encadenarse a un constructor privado. Simplemente lo haces no disponible para fuentes externas.

private MyClass() 
{ 
} 

public MyClass(string something) : this() 
{ 
} 

Eso resuelve el problema. Sin embargo, tenga en cuenta que la protección puede ser una implementación preferida si la clase no está sellada.

Cuestiones relacionadas