¿Cuál es la necesidad del constructor privado en C#? Lo recibí como una pregunta para una prueba C#.¿Cuál es la necesidad de un constructor privado en C#?
Respuesta
Por ejemplo, si tiene una clase que sólo debe ser creado a través de métodos de fábrica. O si tiene sobrecargas del constructor, y algunos de ellos solo deberían ser utilizados por los otros constructores. Probablemente otras razones también =)
Cuando desee evitar la creación de instancias directas de una clase desde fuera de ella, usará un constructor private
. Por ejemplo, antes de C# 2.0, que introdujo static
clases, que utilizó un constructor private
para llevar a cabo más o menos lo mismo:
sealed class StaticClass {
private StaticClass() {
}
public static void DoSomething() {
}
}
Mientras que this link is related to java, creo que debería ayudarlo a entender la razón por la cual la idea es más o menos la misma.
Los constructores privados evitan que los llamadores creen una instancia explícita de una clase. Hay algunos casos comunes donde un constructor privado puede ser útil:
- clases que contienen sólo métodos de utilidad estáticas
- clases que contienen únicas constantes
- tipo enumeraciones seguras
- singletons
Por ejemplo, cuando proporciona métodos de fábrica para controlar la instanciación ...
public class Test(){
private Test(){
}
void DoSomething(){
// instance method
}
public static Test CreateCoolTest(){
return new Test();
}
}
Cuando desee evitar que los usuarios de su clase creen una instancia de la clase directamente. Algunos casos más comunes son:
- clases que contienen sólo métodos estáticos
- Singleton
puedo puedo recordar algunos usos para ello:
- se podría utilizar a partir de un método de fábrica estática dentro de la misma clase
- Podría hacer un trabajo común dentro de él y luego llamarlo desde otra contrucción
- Usted puede usarlo para evitar que el tiempo de ejecución de la adición de un contructure vacía automáticamente
- Podría ser utilizado (aunque privada) de algunas herramientas burlones y ORM (como nhibernate)
Si conoces algún patrón de diseño, es obvio: una clase podría crear una nueva instancia de sí mismo internamente, y no dejar que otros lo hagan. Un ejemplo en Java (no sé C# lo suficientemente bien, lo siento) con una clase Singleton:
class Meh
{
private Meh() { }
private static Meh theMeh = new Meh();
public static Meh getInstance() { return theMeh; }
}
Curiosamente, esta Java también es válida C# - tal vez conozca más C# de lo que cree. ;) –
Usted puede utilizarlo con herencia en un caso en que los argumentos para el constructor de la clase base son de diferentes tipos a los del constructor de clases hijo, pero aún necesita la funcionalidad de la clase base en la clase secundaria, por ejemplo. métodos protegidos
En general, esto debe evitarse siempre que sea posible, ya que esta es una mala forma de herencia que se debe utilizar.
Y, por supuesto, puede usar el constructor privado para evitar la creación de subclases.
Los constructores privados se utilizan para evitar la creación de instancias de una clase cuando no hay campos o métodos de instancia, como la clase Math o cuando se llama a un método para obtener una instancia de una clase. Si todos los métodos de la clase son estáticos, considere la posibilidad de que toda la clase estética. Para obtener más información, consulte Clases estáticas y Miembros estáticos de la clase.
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = System.Math.E; //2.71828...
}
El siguiente es un ejemplo de una clase que utiliza un constructor privado.
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
class TestCounter
{
static void Main()
{
// If you uncomment the following statement, it will generate
// an error because the constructor is inaccessible:
// Counter aCounter = new Counter(); // Error
Counter.currentCount = 100;
Counter.IncrementCount();
System.Console.WriteLine("New count: {0}", Counter.currentCount);
}
}
llego tarde al juego, pero la lectura a través de todas las otras respuestas, no veo este uso mencionó:
utilizo constructores privados en escenarios en los que tengo varios constructores (públicos) , y todos ellos tienen algún código en común. Con el encadenamiento de constructores, el código se vuelve realmente limpio y SECO.
Recuerde, las variables de solo lectura privadas solo se pueden establecer en constructores, por lo que no puedo usar un método regular.
Ejemplo:
public class MyClass
{
private readonly int _a;
private readonly int _b;
private readonly string _x;
public MyClass(int a, int b, string x)
: this(x)
{
_a = a;
_b = b;
}
public MyClass()
: this("(not set)")
{
// Nothing set here...
}
private MyClass(string x)
{
_x = x;
}
}
Básicamente se utilizan constructores privados cuando se está siguiendo un patrón de diseño Singleton. En este caso, tiene un método estático definido dentro de la clase que internamente llama al constructor privado.
Por lo tanto, para crear la instancia de la clase por primera vez, el usuario llama a classname.static_method_name. En este método, dado que el objeto de la clase aún no existe, el método estático llama internamente al constructor privado y devuelve la instancia de la clase.
Si la instancia de la clase ya existe, el método estático simplemente devuelve la instancia al método de llamada.
- 1. constructor privado
- 2. C++ ¿Es privado realmente privado?
- 3. Constructor privado en la clase abstracta
- 4. ¿Cuál es la forma más confiable de prohibir un constructor de copia en C++?
- 5. C++ - ¿Qué está haciendo esto si el constructor es privado?
- 6. ¿Cuál es la necesidad de normalizar un vector?
- 7. Cuál es la necesidad de la clase Void en Java
- 8. ¿Por qué necesitamos un constructor privado?
- 9. ¿Qué es un "encabezado privado" en C?
- 10. ¿Es privado un campo C# por defecto?
- 11. ¿Cuál es la necesidad del marco de recopilación en Java?
- 12. constructor privado y final
- 13. ¿Cuál es la necesidad de la función de javascript getUTCFullYear()?
- 14. Acceso a un constructor privado desde fuera de la clase en C#
- 15. ¿Cuál es la necesidad de tener parámetros "nmem" y "tamaño" en las funciones C?
- 16. ¿Por qué no es privado el constructor de String()?
- 17. En Java, ¿cómo hago una clase con un constructor privado cuya superclase también tiene un constructor privado?
- 18. ¿Es posible anular un constructor en C#?
- 19. ¿Cómo crear una instancia de un objeto con un constructor privado en C#?
- 20. ¿Qué es un ejemplo de Java de la expresión "captura de constructor privado"?
- 21. ¿Cuál es el constructor predeterminado para el puntero de C++?
- 22. alcance del constructor privado en la clase jerarquizada
- 23. ¿Cuál es la necesidad de un atributo de valor no guardado en hibernación?
- 24. IntelliJ IDEA + Maven ¿cuál es la necesidad de entradas de dependencia en un archivo iml?
- 25. ¿Podemos tener un constructor privado en una clase estática?
- 26. ¿Puedo elegir un constructor privado en el cuerpo de la clase o no?
- 27. se extiende de la clase con constructor privado
- 28. Método virtual privado en C++
- 29. ¿Cuál es la diferencia entre "privado" e "interno protegido"?
- 30. ¿Cómo puedo acceder a un constructor privado de una clase?
En realidad, cuando tiene que controlar la creación de instancias de clases, eso podría ser a través de un patrón de fábrica o un patrón singleton. –
@ André: ¿Y tu punto es? Eso seguiría siendo una razón para tener constructores privados. A menos que su clase de fábrica sea una clase diferente, pero ese es un tema diferente. – Svish