2009-07-31 17 views
5

Ho una classe, questa classe può essere vuota. Questa classe ha solo proprietà pubbliche di tipo String. Quando questa classe si trova in uno stato vuoto, ciò significa che tutte le proprietà hanno il valore di String.Empty.Come implementare correttamente il mio campo vuoto o zero statico

1) Con un campo statico pubblico , è possibile modificare le proprietà di Class.Empty.

2) Non vedo che un pubblico statico proprietà getter dovrebbe restituire un nuovo oggetto vuoto (impostare tutti i campi per svuotare manualmente) ogni volta. Considero quella cattiva pratica.

3) Una soluzione alternativa è implementare la propria classe . IsNullOrEmpty (Classe obj).

4) A non statico proprietà booleane pubbliche obj. IsEmpty.

Nell'altra classe dove questa classe viene utilizzato, la proprietà non sarà mai nulla. L'altra classe viene restituita da un metodo (di un'altra classe) che lo inizializza correttamente.

L'unico caso in cui la proprietà potrebbe essere nullo, è se è stato inserito all'esterno di tale metodo, che quindi lo fa comunque essere in uno stato non valido.

risposta

9

conflitto 1 e 2, in pratica.

O il tipo è immutabile, nel qual caso è possibile restituire un riferimento alla stessa istanza ogni volta ... o è mutevole, nel qual caso si deve per restituire un riferimento a un nuovo oggetto ogni volta.

Il motivo string.Empty va bene è precisamente perché string è immutabile.

Il tuo tipo ha la capacità di di essere modificabile?

MODIFICA: in base al tuo commento, sembra che le proprietà non debbano avere setter. Invece, i valori dovrebbero essere passati al costruttore e memorizzati in campi di sola lettura.

A quel punto il vostro tipo è immutabile, in modo da poter esporre sia un campo pubblico o una proprietà che restituisce sempre lo stesso valore, vale a dire

private static readonly MyType empty = new MyType("", ""); // Or whatever 
public static MyType Empty { get { return empty; } } 

o

public static readonly MyType Empty = new MyType("", ""); 

Non è necessario preoccuparsi di chiunque imposti proprietà, perché non hai alcun setter ...

+0

Una volta che le proprietà sono impostate, non dovrebbero mai cambiare. Quindi la risposta è no, giusto? –

+0

Modifica risposta per riflettere commento ... –

+0

Questo è vero, è così che inizialmente ho impostato le proprietà, tramite il costruttore. Purtroppo ho dimenticato di menzionare che il tipo verrà serializzato con XmlSerializer.A mia conoscenza, ciò richiede get/setter pubblici per tutte le proprietà serializzate. Tuttavia, se implemento IXmlSerializable (questa è una classe piccola destinata a non cambiare), non sono necessario i setter pubblici. Corretta? Se questa classe dovesse cambiare, non solo devo modificare/aggiungere campi, ma anche le stringhe nelle implementazioni IXmlSerializable? –

Problemi correlati