Tipos de estructura deben, cuando sea posible, o bien han de su estado encapsulado en campos públicos que de forma independiente se puede establecer en cualquier valor que son válidos para su respectivo tipo, o de lo contrario se comportan como un solo valor unificado que puede solo apostar a través de constructor, fábrica, método o, de lo contrario, pasar una instancia de la estructura como un parámetro explícito ref
a uno de sus métodos públicos. Al contrario de lo que afirman algunas personas, no hay nada de malo en que una estructura tenga campos públicos, si se supone que representa un conjunto de valores que pueden ser manipulados individualmente o transferidos como un grupo (por ejemplo, las coordenadas de un punto). Históricamente, ha habido problemas con estructuras que tenían entidades públicas de creación de propiedades, y el deseo de evitar campos públicos (lo que implica que los instaladores deberían usarse en su lugar) ha llevado a algunas personas a sugerir que las estructuras mutables deben evitarse por completo, pero los campos no tienen problemas que las propiedades tenían. De hecho, una estructura de campo expuesto es la representación ideal para una colección suelta de variables independientes, ya que es solo una colección suelta de variables.
En su ejemplo particular, sin embargo, parece que los dos campos de su estructura probablemente no se supone que sean independientes. Hay tres maneras en que su estructura sensiblemente podría diseñarse:
que podría tener el único campo público sea la cadena, y luego tener una propiedad de sólo lectura "ayudante" llama length
que informaría de su longitud si la cadena no es nulo, o devuelve cero si la cadena es nula.
Puede hacer que la estructura no exponga ningún campo público, definidor de propiedad o método de mutación, y que el contenido del único campo, una cadena privada, se especifique en el constructor del objeto. Como se indicó anteriormente, length
sería una propiedad que informaría la longitud de la cadena almacenada.
Puede hacer que la estructura no exponga ningún campo público, establecimiento de propiedades o métodos de mutación, y tiene dos campos privados: uno para la cadena y otro para la longitud, ambos se establecerán en un constructor que tome una cuerda, la almacena, mide su longitud y la almacena. La determinación de la longitud de una cadena es lo suficientemente rápida como para que probablemente no valga la pena calcularla y almacenarla en caché, pero podría ser útil tener una estructura que combinara una cadena y su valor GetHashCode
.
Es importante ser consciente de un detalle en relación con el tercer diseño, sin embargo: si el código no-hilo hace que una instancia de la estructura para ser leído mientras que otro hilo está escribiendo a la misma, que puede causar la creación accidental de una instancia de struct cuyos valores de campo son inconsistentes. Los comportamientos resultantes pueden ser un poco diferentes de los que se producen cuando las clases se utilizan de forma no segura para hilos. Cualquier código que tenga algo que ver con la seguridad debe tener cuidado de no suponer que los campos de estructura estarán en un estado consistente, ya que el código malicioso, incluso en un entorno de "confianza total", puede generar fácilmente estructuras cuyo estado es inconsistente si eso es lo que ocurre quiere hacer
PS - Si desea que su estructura para ser inicializado usando un encargo de una cadena, se recomienda usar un operador de conversión implícita y haciendo Length
ser una propiedad de sólo lectura que devuelve la longitud del subyacente cadena si no es nulo, o cero si la cadena es nula.
No haga estructuras mutables. http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – Ani
'String' s ya conoce su longitud. ¿Por qué necesitarías una estructura como esta? –
@Karl Knechtel: Supongo que es un ejemplo para mostrar el principio. El código que se muestra ni siquiera compila ... – Guffa