tipi struttura dovrebbe, quando praticabile, né hanno tutti del loro stato incapsulato in settori comuni che possono indipendentemente essere impostati tutti i valori che sono validi per i rispettivi tipo, oppure si comportano come un unico valore unitario che può solo scommessa impostata tramite costruttore, fabbrica, metodo, oppure passando un'istanza della struct come parametro esplicito ref
a uno dei suoi metodi pubblici. Contrariamente a quanto sostengono alcune persone, non c'è niente di sbagliato in una struttura con campi pubblici, se si suppone che rappresenti un insieme di valori che possono essere sensibilmente manipolati individualmente o fatti passare come un gruppo (ad esempio le coordinate di un punto). Storicamente, ci sono stati problemi con le strutture che avevano insediamenti di proprietà pubbliche, e il desiderio di evitare i campi pubblici (sottintendendo che i setter dovrebbero essere usati) ha portato alcune persone a suggerire che le strutture mutabili dovrebbero essere evitate del tutto, ma i campi non hanno il problemi che avevano le proprietà. In effetti, una struttura a campo scoperto è la rappresentazione ideale per una raccolta libera di variabili indipendenti, dal momento che lo è solo una serie di variabili.
Nel tuo particolare esempio, tuttavia, sembra che i due campi della struttura non siano probabilmente indipendenti. Ci sono tre modi la tua struct potrebbe ragionevolmente essere progettato:
si potrebbe avere l'unico campo pubblico sia la corda, e poi hanno un sola lettura "aiutante" proprietà chiamata length
che segnalare la lunghezza se la stringa non è nulla, o restituisce zero se la stringa è nulla.
È possibile che la struttura non esponga campi pubblici, setter di proprietà o metodi di mutazione e che il contenuto del solo campo, una stringa privata, sia specificato nel costruttore dell'oggetto. Come sopra, length
sarebbe una proprietà che segnalerebbe la lunghezza della stringa memorizzata.
Si potrebbe avere la struttura non esporre campi pubblici, setter di proprietà o metodi di muting e avere due campi privati: uno per la stringa e uno per la lunghezza, entrambi impostati in un costruttore che accetta una stringa, la memorizza, ne misura la lunghezza e la memorizza. Determinare la lunghezza di una stringa è sufficientemente veloce che probabilmente non sarebbe utile calcolarlo e memorizzarlo nella cache, ma potrebbe essere utile avere una struttura che combina una stringa e il suo valore GetHashCode
.
È importante essere a conoscenza di un dettaglio per quanto riguarda il terzo motivo, però: se il codice non threadsafe provoca un'istanza della struttura da leggere mentre un altro thread scrive ad esso, che può causare la creazione accidentale di un'istanza struct i cui valori di campo sono incoerenti. I comportamenti risultanti potrebbero essere leggermente diversi da quelli che si verificano quando le classi vengono utilizzate in modalità non a prova di bug. Qualsiasi codice che abbia a che fare con la sicurezza deve fare attenzione a non presupporre che i campi della struttura si trovino in uno stato coerente, dal momento che il codice malevolo - anche in un ambiente di "fiducia totale" - può facilmente generare strutture il cui stato è incoerente se è ciò che vuole fare.
PS - Se si desidera consentire la vostra struttura per essere inizializzati con un incarico da una stringa, vi suggerirei di usare un operatore di conversione implicita e facendo Length
essere una proprietà di sola lettura che restituisce la lunghezza del sottostante stringa se non-null o zero se la stringa è nulla.
Si prega di non creare strutture mutevoli. http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – Ani
'String già conoscono la loro lunghezza. Perché avresti bisogno di una struttura come questa? –
@Karl Knechtel: presumo che sia un esempio per mostrare il principio. Il codice mostrato non viene nemmeno compilato ... – Guffa