2010-01-12 8 views
7

Qual è il modo migliore per rendere una proprietà di classe "Scrivi una volta, leggi molte" in modo tale che è possibile impostare la proprietà una sola volta?Come posso creare una proprietà "Write Once Read Many" in VB.NET?

So che potrei passare tutte le proprietà nel costruttore e renderle ReadOnly, ma nei casi con molte proprietà non voglio un costruttore che abbia più di 20 argomenti.

Inoltre, mi rendo conto che posso "rotolare i miei" setter, ma doverlo fare per ogni proprietà sembra una serie di codici ridondanti.

Esiste un modo pulito per eseguire questa operazione in VB 2008 .NET 3.5?

+2

correlati: http://stackoverflow.com/questions/1079292/should-i-use-set- variabili una volta/1079316 – peterchen

risposta

2

A Write Once La proprietà non è mai "pulita".

Si consiglia di creare un costruttore/classe di fabbrica per evitare il 20 parametro CTor. (Sì, lo so che è un po 'di battitura)

discussione simile qui: Should I use set once variables?

[modifica] Inoltre, anche se insistete non vedo un'altra opzione di posizionare il proprio setter, che è un sacco di digitazione, anche.

+0

Grazie. Il post che hai collegato spiega molto, e sono d'accordo con il tuo principio di "Meno sorprese". Usare un costruttore può essere la soluzione migliore. –

+0

Le proprietà write-once con i setter esposti non sono pulite, ma tali proprietà combinate con un metodo 'TrySet' che utilizza' CompareExchange' possono avere utili caratteristiche di sicurezza del thread. Ad esempio, in un'implementazione di una coda di elenco collegato, il puntatore "successivo" di un determinato elemento sarà "null" (per l'ultimo elemento) o punterà a un altro elemento. Il codice che vuole aggiungere alla coda può provare a scrivere sul puntatore 'next' dell'ultimo elemento; se fallisce, deve seguire i puntatori "next" fino a quando non trova il nuovo ultimo elemento, e riprova. – supercat

+0

@supercat: accettato, ma il setter dovrebbe essere un metodo separato (come TrySet), non un setter proeprty. Quindi direi che "non è davvero una proprietà di sola scrittura". – peterchen

0

Il modo "più pulito" sarebbe di non farlo affatto e utilizzare le proprietà automatiche. Non riesco a vedere il bisogno anche per questo. È davvero così importante che possano essere scritti solo una volta? Se così fosse, andrei sicuramente con un costruttore che prende i valori per tutte le proprietà come parametri.

+0

Un esempio di una proprietà che utilizzerei per questo è una proprietà "ID", ovvero un identificativo univoco per la classe. Non è vita o morte, ma garantirebbe che l'"ID" non venga modificato da un altro codice. Non sono così familiare con Auto Properties, oltre a sapere che non sono supportati nella versione VB che sto usando. È possibile farli scrivere una volta letto molti? –

2

io so che è stato quasi 3 anni, ma qui è la mia soluzione che credo sia meglio:

public class Site 
{ 
    private int miID; 

    public Site(int iNewID, string sName) 
    { 
     miID = iNewID; 
     Name = sName; 
    } 
    // The ID property can only be set once in the constructor 
    public int ID 
    { 
     get { return miID; } 
    } 
    public string Name { get; set; } 
} 
+3

Benvenuti in StackOverflow! Dovresti provare a spiegare perché pensi che la tua soluzione sia migliore. – nalply

Problemi correlati