En primer lugar, ¿verdad realmente tiene que tener una estructura mutable? Ellos son malvados Del mismo modo, campos públicos.
Aparte de eso, me acabo de crear un constructor teniendo los dos bits de datos:
class SomeClass
{
struct MyStruct
{
private readonly string label;
private readonly int id;
public MyStruct (string label, int id)
{
this.label = label;
this.id = id;
}
public string Label { get { return label; } }
public string Id { get { return id; } }
}
static readonly IList<MyStruct> MyArray = new ReadOnlyCollection<MyStruct>
(new[] {
new MyStruct ("a", 1),
new MyStruct ("b", 5),
new MyStruct ("q", 29)
});
}
Nota el uso de ReadOnlyCollection en lugar de exponer la matriz misma - esto hará que sea inmutable, evitando the problem exposing arrays directly. (El programa de códigos inicializa un conjunto de estructuras; luego pasa la referencia al constructor de ReadOnlyCollection<>
).
@ Chris: No, yo diría que va mucho más allá de simplemente API públicamente consumibles. ¿Qué tan grande es tu equipo? ¿* Siempre * vas a trabajar para esa compañía? ¿Cuán seguro estás de que * cada miembro de tu equipo *, ahora y para siempre, entiende las muchas y variadas rarezas de las estructuras mutables? Para el código descartable, estaría de acuerdo ... pero la mayoría del código vive mucho más en el modo de mantenimiento de lo que originalmente esperábamos, y un diseño deficiente puede hacer que sea mucho más difícil desentrañarlo más adelante. Encuentra que alguien ha pasado un campo por referencia y luego * no * puede refactorizar a las propiedades sin romperlo, etc. –
Impresionante John, me acaba de dar cuenta de un nuevo ángulo de programación orientada a objetos moderna. Gracias .. – Adarsha
Es una pena que haya tanto tipeo adicional aquí. En C++ 11 puedo hacer: 'struct foo {int i; const char * str; char c; }; foo f [] = {{1, "hola", 'c'}, {2, "adiós", 'd' "}};' Sería bueno si uno no necesitara escribir el constructor o tengo que escribir tanto " – Bklyn