Ho un singleton che unisce insieme diverse strutture di dati. Parte di ciò che espongo attraverso quel singleton sono alcune liste e altri oggetti, che rappresentano le chiavi o le colonne necessarie per connettere le strutture di dati collegate. Dubito che qualcuno proverebbe a cambiare questi oggetti attraverso un modulo diverso, ma voglio proteggerli esplicitamente da quel rischio. Quindi attualmente sto usando un modificatore "readonly" su quegli oggetti *.
Sto usando readonly invece di const con gli elenchi mentre leggo che l'uso di const incorporerà quegli elementi negli assembly di riferimento e quindi attiverà una ricostruzione di quegli assembly di riferimento se / quando la lista (s) è / è modificata . Questo sembra un accoppiamento più stretto di quello che vorrei tra i moduli, ma mi chiedo se sono ossessionato da un punto controverso. (Questa è la domanda n. 2 in basso)
L'alternativa che vedo usare "readonly" è rendere private le variabili e quindi includerle con un get pubblico. Sto lottando per vedere il vantaggio di questo approccio in quanto sembra un codice wrapper che non offre molti vantaggi aggiuntivi. (Questa è la domanda n. 1 in basso)
È altamente improbabile che cambiassimo il contenuto o il formato degli elenchi - sono una raccolta di cose da evitare di usare le stringhe magiche ovunque. Sfortunatamente, non tutto il codice è stato convertito per usare la presentazione di queste stringhe di singleton.
Allo stesso modo, non so che cambieremmo i contenitori / le classi per gli elenchi. Quindi, mentre normalmente sostengo i vantaggi di incapsulamento offerti da un wrapper get, in questo caso non lo sento.
Un campione rappresentativo del mio singleton
public sealed class mySingl
{
private static volatile mySingl sngl;
private static object lockObject = new Object();
public readonly Dictionary<string, string> myDict = new Dictionary<string, string>()
{
{"I", "index"},
{"D", "display"},
};
public enum parms
{
ABC = 10,
DEF = 20,
FGH = 30
};
public readonly List<parms> specParms = new List<parms>()
{
parms.ABC,
parms.FGH
};
public static mySingl Instance
{
get
{
if(sngl == null)
{
lock(lockObject)
{
if(sngl == null)
sngl = new mySingl();
}
}
return sngl;
}
}
private mySingl()
{
doSomething();
}
}
Domande:
- Sto prendendo l'approccio più ragionevole in questo caso?
- Dovrei preoccuparmi di const e readonly?
- c'è un modo migliore per fornire queste informazioni?
Per risolvere alcuni dubbi aggiuntivi:
Prima di tutto, capisco che ci sono persone che si oppongono all'uso dei singleton. Penso che sia un uso appropriato in questo caso poiché è un'informazione costante sullo stato, ma sono aperto a opinioni / soluzioni diverse. (Vedi Il modello singleton e Quando il pattern Singleton non dovrebbe essere utilizzato? )
In secondo luogo, per un pubblico più ampio: C ++ / CLI ha una parola chiave simile a readonly
con initonly
, quindi questa non è una domanda di tipo C #.
( Campo letterale rispetto a variabile costante in C ++ / CLI )
Sidenote: Una discussione su alcune delle sfumature sull'uso di const o readonly .