C # / VB struct - come evitare il caso con valori di default zero, che è considerato non valido per una determinata struttura?

4

Come implementare una struttura / struttura .NET vincolata (diciamo LimitedString ), dove il suo stato con i valori predefiniti (impostato da CLR a valori tecnici predefiniti, vale a dire null, zeri, ecc.) dovrebbe essere proibito a causa di alcuni design vincolo?

Ad esempio, in caso di banale struct LimitedString , le proprietà sono String Value e int MaxLength = 10 , dove il valore della proprietà MaxLength deve essere almeno 1 . Il valore 0 non è consentito dalla progettazione. Ma quando initalizzo la struttura, ho 0 lì. Come forzare il valore 10 nei valori predefiniti?

Vedo due opzioni:

  1. Genera un'eccezione in static ( shared ) costruttore senza parametri → forza usando solo costruttore / i con parametri. A volte è previsto un uso improprio e senza parametri.
  2. Aggiungi campo privato helper IsInitialized e mentre è false , assume valori predefiniti, cioè MaxLength = 10 . Una complessità leggermente superiore all'interno della struttura

L'opzione # 2 è legittima o viola alcuni principi di progettazione? C'è un modo migliore rispetto all'opzione # 2?

EDIT: l'opzione # 1 non funzionerà comunque, il costruttore menzionato viene chiamato ogni volta, anche se vengono chiamati altri costruttori.

    
posta miroxlav 13.05.2016 - 13:28
fonte

2 risposte

4

A meno che tu non abbia una buona ragione veramente che questo abbia per rimanere una Struct, ti consiglio di convertirlo in una Classe.
In questo modo, l'inizializzazione è completamente sotto il tuo controllo, attraverso il Costruttore / i di quella Classe.

Se davvero non puoi convertirlo, suggerirei di creare una classe factory per "costruire" le istanze di questo Struct; questa classe si assume quindi la responsabilità di inizializzare correttamente le istanze della Struct.

    
risposta data 13.05.2016 - 13:39
fonte
5

Prima nota: sono d'accordo che probabilmente dovrebbe essere una lezione. Per una struttura, però:

È possibile modificare il design? Nel caso di LimitedString , sembra che 0 sia perfettamente a posto: una stringa senza caratteri. Non è possibile applicare alcun valore con un costruttore predefinito (come suggerito nel n. 1) perché structs (in C #) non può contenere costruttori senza parametri espliciti .

Per il n. 2, forse è più semplice cambiare il significato dello stato della struttura per stabilire un buon default predefinito senza aggiungere un flag aggiuntivo o una condizione 0 del caso speciale:

private int _maxLengthMinusTen; // By default 0, making MaxLength 10.
public int MaxLength => _maxLengthMinusTen + 10;

Un costruttore eseguirà la conversione da un input maxLength , oppure potresti fornire un setter privato per mantenere il 10 localizzato nel codice.

    
risposta data 13.05.2016 - 17:47
fonte

Leggi altre domande sui tag