vacio predeterminado polimorfico metodos herencia constructores c# .net struct

predeterminado - metodos en c#



Ocultar constructor sin parĂ¡metros en struct (4)

¿Es posible ocultar el constructor sin parámetros de un usuario en c #

Quiero obligarlos a usar siempre el constructor con parámetros

por ejemplo, esta clase de posición

public struct Position { private readonly int _xposn; private readonly int _yposn; public int Xposn { get { return _xposn; } } public int Yposn { get { return _yposn; } } public Position(int xposn, int yposn) { _xposn = xposn; _yposn = yposn; } }

Solo quiero que los usuarios puedan actualizar una Posición especificando las coordenadas xey

Sin embargo, el constructor sin parámetros SIEMPRE está disponible

No puedo hacerlo en privado. O incluso definirlo como público

He leído esto ¿Por qué no puedo definir un constructor predeterminado para una estructura en .NET?

pero realmente no ayuda

Si esto no es posible, ¿cuál es la mejor manera de detectar si la posición que estoy pasando tiene valores?

Explicidad revisando cada campo de propiedad? ¿Hay un camino más elegante?

Gracias


Bueno, una estructura es literalmente una declaración de cómo se sentará la memoria.

Incluso cuando utiliza un objeto, el puntero de los objetos se declara, independientemente de si es nulo.

La razón por la que no se puede ocultar el constructor es porque la estructura exige que el CLR pueda crearla internamente, debe hacerlo.

Puede convertir esta estructura en un objeto para lograr esta tarea. ¿O usa análisis estático para asegurarse de que esté inicializado antes de usarlo?

struct point { int xpos; int ypos; }

Tener un google para objetos inmutables, esto parece ser lo que buscas. Creo que buscan agregar esta característica (pero no en C # 4) al idioma en sí, porque es un requisito común. ¿Hay una necesidad específica de una estructura aquí?


No se puede hacer una estructura con un constructor privado sin parámetros o incluso declarar un constructor sin parámetros. Deberías cambiarlo a una clase. Las estructuras no permiten declarar un constructor sin parámetros.

Desde el tutorial de Structs en MSDN:

Las estructuras pueden declarar constructores, pero deben tomar parámetros. Es un error declarar un constructor predeterminado (sin parámetros) para una estructura. Los miembros de Struct no pueden tener inicializadores. Siempre se proporciona un constructor predeterminado para inicializar los miembros de la estructura a sus valores predeterminados.

De la especificación C # en MSDN:

11.3 Diferencias de clase y estructura

Las estructuras difieren de las clases de varias maneras importantes:

  • Las estructuras son tipos de valores (Sección 11.3.1).
  • Todos los tipos de estructuras heredan implícitamente de la clase System.ValueType (Sección 11.3.2). La asignación a una variable de tipo struct crea una copia del valor asignado (Sección 11.3.3).
  • El valor predeterminado de una estructura es el valor producido al establecer todos los campos de tipo de valor en su valor predeterminado y todos los campos de tipo de referencia en nulo (Sección 11.3.4). Las operaciones de boxeo y desempaquetado se usan para convertir un tipo de estructura y un objeto (Sección 11.3.5).
  • El significado de esto es diferente para las estructuras (Sección 11.3.6).
  • Las declaraciones de campo de instancia para una estructura no pueden incluir inicializadores de variable (Sección 11.3.7).
  • Una estructura no puede declarar un constructor de instancia sin parámetros (Sección 11.3.8).
  • Una estructura no tiene permitido declarar un destructor (Sección 11.3.9).

No, no puede ocultarlo. Structs no puede redefinir el constructor arg cero, por lo que su visibilidad no se puede redefinir.


No, no puedes hacer esto. Como dijo, se hizo una pregunta similar antes, y pensé que la respuesta era bastante clara: no podría hacerlo.

Puede crear un constructor privado sin parámetros para una estructura , pero no en C #. Sin embargo, incluso si lo hace, realmente no ayuda, porque puede evitarlo fácilmente:

MyStruct[] tmp = new MyStruct[1]; MyStruct gotcha = tmp[0];

Ese será el valor predeterminado de MyStruct, el valor de "todos los ceros", sin llamar nunca a un constructor.

Usted puede agregar fácilmente un método Validate a su estructura y llamarlo cada vez que haya recibido uno como parámetro, sin dudas.