Devo usare nameof per evitare la ripetizione nelle costanti?

2

In C #, a volte uso:

const string FirstName = "FirstName";
const string SSN = "SSN";

...

var ssn = GetValue(key: SSN);  // e.g. GetValue fetches value from some key/value store

per evitare stringhe di chiave hard-coding nel mio codice. Sto pensando di approfittare di C # 6.0 nameof per evitare la ripetizione nella dichiarazione const , in questo modo:

const object FirstName = null;
const object SSN = null;

...

var ssn = GetValue(key: nameof(SSN));

È un uso corretto di nameof ? C'è un modo migliore per evitare la ripetizione nelle dichiarazioni const ?

    
posta JoelFan 21.04.2016 - 23:26
fonte

3 risposte

3

Che ne dici di un'enumerazione? (grazie a @JoelFan per aver indicato il metodo Enum ToString )

var value = GetValue(Keys.SSN.ToString());

E ovviamente definiresti un'enumerazione con ciascuna delle tue chiavi.

enum Keys
{
    SSN, FirstName 
}
    
risposta data 21.04.2016 - 23:52
fonte
3

No. Hai reso il contratto della costante SSN davvero debole, non è assolutamente ovvio a cosa serve.

Potresti usare nameof nella definizione, ma sarebbe comunque simile al tuo codice originale.

const string FirstName = nameof(FirstName);
const string SSN = nameof(SSN);
    
risposta data 21.04.2016 - 23:39
fonte
1

Qualcun altro ha menzionato questo, ma penso davvero che un Enum sia lo strumento per il lavoro qui. Ecco una spiegazione dettagliata di quando e perché possono essere utili. È una buona scelta di design rispetto a molte altre opzioni di costante / chiave per prestazioni, estensibilità, leggibilità, ecc.

Se capisco cosa stai cercando di fare, un Enum sta facendo esattamente quello che intendi con il tuo uso off-label di nameof : una costante che è solo un nome. Mi piace il termine "costante strongmente tipizzata" per descrivere il concetto di Enum . Fuori dalla mia testa ...

// Note: Enum names should describe a generic member, so avoid names like IDs/KeyCollection/PersonalData
public Enum Identifier
{
 FirstName, SSN, Fingerprint, Retina, OtherKey, FinalKey
}
// ...
var ssn = GetValue(SSN);

// Other considerations vs const string keys:
string[] AllMyConstants = Enum.GetNames(typeof(Identifier)); // Collections and parsing to/from strings built-in
////Identifier.SSN = "Compiler error will save me from trying to change a constant."

// Bonus thing I just learned: System.Enum uses ints underneath, so you can get imaginative defining enums as ints:
public Enum BasketballPosition {PG = 1, SG = 2, SF = 3, PF = 4, C = 5};
public Enum Grade {F = 0, D = 60, C = 70, B = 80, A = 90};  
public Enum DifficultyFactor {Easy = 1, Medium = 10, Hard = 100, Insane = 1000};
public Enum Transaction {Deposit = 1, Withdrawal = -1, Transfer = 0};
public Enum MilestoneDay {Conceived = -270, Born = 0, FirstBirthday = 365, EighteenthBirthday = 6570}; 
    
risposta data 22.04.2016 - 03:50
fonte

Leggi altre domande sui tag