tipos predeterminado poo polimorfico objeto instancias inicializar herencia hacer declaracion constructores como automatico c# struct

c# - poo - ¿Que está sucediendo aquí? ¿Cómo puedo llamar al constructor predeterminado cuando no hay ninguno?



inicializar un objeto en c# (3)

Dado el siguiente código:

public struct Foo { public Foo(int bar, int baz) : this() { Bar = bar; // Err 1, 2 Baz = baz; // Err 3 } public int Bar { get; private set; } public int Baz { get; private set; } }

¿Qué hace : this() realidad? No hay un constructor predeterminado, entonces, ¿a qué llama? Sin este apéndice, todo se bloquea con errores.

Error 1 The ''this'' object cannot be used before all of its fields are assigned to Error 2 Backing field for automatically implemented property ''Foo.Bar'' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer. Error 3 Backing field for automatically implemented property ''Foo.Baz'' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.


Entonces, ¿por qué un constructor de estructuras sin argumentos no está permitido en C #? Esto se debe a que las estructuras ya contienen un constructor predeterminado que no tiene argumentos. Tenga en cuenta que este constructor predeterminado es parte del framework .Net, por lo tanto, no es visible en nuestro código. El único propósito del constructor predeterminado es asignar valores predeterminados a sus miembros.

Básicamente, todas las estructuras ya tienen un constructor predeterminado. La situación sería diferente con una clase.


A medida que utiliza el acceso directo para las propiedades, solo puede acceder a las propiedades a través de sus instaladores y buscadores. Sin embargo, antes de que se hayan asignado todos los campos, no puede llamar a ninguno de los instaladores. Una solución para esto es llamar al constructor sin parámetros que se crea automáticamente, que inicializó los campos. Esto, por supuesto, significa que está inicializando los campos dos veces.

Cuando me enfrenté a este problema hace unos días, simplemente eliminé el acceso directo para las propiedades y declare las variables locales para que pudiera establecerlas en el constructor:

public struct Foo { public Foo(int bar, int baz) { _bar = bar; _baz = baz; } private int _bar, _baz; public int Bar { get { return _bar; } } public int Baz { get { return _baz; } } }


esto explica por qué agregaron este cheque adicional.