poo estructuras ejemplos datos c# constructor struct backing-field

datos - estructuras en c# ejemplos



¿Cómo puedo establecer el valor de los campos de respaldo de la propiedad automática en un constructor de estructuras? (2)

Necesitas usar el constructor "this":

public SomeStruct(String stringProperty, Int32 intProperty) : this() { this.StringProperty = stringProperty; this.IntProperty = intProperty; }

Hacer esto llama al constructor predeterminado y al hacerlo, inicializa todos los campos, lo que permite hacer referencia a esto en el constructor personalizado.

Dada una estructura como esta:

public struct SomeStruct { public SomeStruct(String stringProperty, Int32 intProperty) { this.StringProperty = stringProperty; this.IntProperty = intProperty; } public String StringProperty { get; set; } public Int32 IntProperty { get; set; } }

Por supuesto, se genera un error de compilación que dice : ''este'' no se puede usar antes de asignar todos sus campos .

¿Hay alguna manera de asignar valores a los campos de respaldo o las propiedades en sí, o tengo que implementar propiedades a la antigua usanza con mis propios campos de respaldo explícitos?


Si una estructura va a tener, y sus usuarios esperarán que tenga, las tres características siguientes:

  1. Todo su estado está encapsulado en un conjunto fijo particular de miembros legibles
  2. Se puede crear fácilmente una instancia en la que esos miembros tengan cualquier combinación de valores que sean válidos para sus respectivos tipos.
  3. Una instancia predeterminada del tipo debe tener todos los miembros establecidos en los valores predeterminados de sus respectivos tipos.

el tipo debe exponer a sus miembros como campos. Los requisitos anteriores significan que una estructura no podrá hacer nada de lo que una estructura de campo expuesto no puede hacer, y también significará que si el código no golpea ningún peligro de subprocesamiento, la estructura podrá hacer cualquier cosa en un campo expuesto. struct puede hacerlo, aunque quizás más lentamente y con más riesgos de enhebrado.

Si una estructura Foo tiene campos f1 y f2 , y un constructor que establece esos campos en ese orden, y si fooExpr es una especie de expresión de tipo Foo [tal vez una variable, campo, referencia de matriz, propiedad o lo que sea] la instrucción:

myFoo.f2 = someValue;

solo se permitirá en los casos donde se podría decir legalmente

myFoo = new Foo(myFoo.f1, someValue);

y en todas las circunstancias donde se permite la primera forma y el comportamiento de la segunda forma tiene una semántica definida, se comportarán de manera idéntica. Por lo tanto, tratar de "encapsular" las propiedades de Foo realmente no logra nada excepto hacer que el código sea más engorroso de escribir, menos claro y más lento de ejecutar.