Il modo migliore per utilizzare una proprietà per fare riferimento a una coppia chiave-valore in un dizionario [chiuso]

StackOverflow https://stackoverflow.com/questions/44100

Domanda

Questa è una questione abbastanza banale, ma sono curioso di sentire le opinioni della gente a riguardo.

Se ho un dizionario a cui accedo tramite le proprietà, quale di questi formati preferiresti per la proprietà?

/// <summary>
/// This class's FirstProperty property
/// </summary>
[DefaultValue("myValue")]
public string FirstProperty {
    get {
        return Dictionary["myKey"];
    }
    set {
        Dictionary["myKey"] = value;
    }

Questo è probabilmente il modo tipico di farlo.È abbastanza efficiente, facile da capire, ecc.L'unico svantaggio è che con una chiave più lunga o più complessa sarebbe possibile scriverla in modo errato o modificare solo un'istanza o qualcosa del genere, portandomi a questo:

/// <summary>
/// This class's SecondProperty property
/// </summary>
[DefaultValue("myValue")]
private const string DICT_MYKEY = "myKey"
public string SecondProperty {
    get {
        return Dictionary[DICT_MYKEY];
    }
    set {
        Dictionary[DICT_MYKEY] = value;
    }

Il che è leggermente più complicato, ma sembra offrire ulteriore sicurezza ed è più vicino a quella che considererei la soluzione "Codice completo".Lo svantaggio è che quando hai già anche un blocco /// e un blocco [DefaultValue()] sopra la proprietà, inizia a diventare un po' affollato lassù.

Quindi quale ti piace di più e perché?Qualcuno ha qualche idea migliore?

È stato utile?

Soluzione

Mi piace il secondo semplicemente perché evitare l'uso di stringhe/numeri magici nel codice è una buona cosa.IMO se è necessario fare riferimento a un numero o a una stringa letterale nel codice più di una volta, dovrebbe essere una costante.Nella maggior parte dei casi, anche se utilizzato solo una volta, dovrebbe essere costante

Altri suggerimenti

Sono d'accordo con @Glenn per un punto di vista puramente pignolo.La risposta è qualunque cosa funzioni per te.Tutto questo codice si svolge su 10 righe (se includi l'ultima parentesi graffa omessa).Nessuno si perderà e la possibilità di errori di battitura è piuttosto ridotta (non impossibile ma molto ridotta).D'altra parte, se hai usato la chiave da qualche altra parte, allora scegli SICURAMENTE la costante.

Personalmente, ti rimprovererei per il tuo stile con le parentesi graffe.:) Stavo solo scherzando!È davvero una questione di stile.

Questo non risponde alla tua domanda, ma non penso che "DefaultValue" significhi quello che pensi che significhi.Non imposta un valore predefinito per la tua proprietà.

Vedere MSDN E questa domanda per ulteriori dettagli.

Molte persone probabilmente sosterrebbero che la seconda opzione è "corretta", perché qualsiasi valore utilizzato più di una volta dovrebbe essere sottoposto a refactoring in una costante.Molto probabilmente utilizzerei la prima opzione.Ti sei già avvicinato alla soluzione "Code Complete" incapsulando la voce del dizionario in una proprietà tipizzata in modo sicuro.Ciò riduce la possibilità di sbagliare recuperando la voce sbagliata del dizionario nell'implementazione.Ci sono solo 2 posti in cui potresti sbagliare digitando "myKey", nel getter e nel setter, e questo sarebbe molto facile da individuare.

La seconda opzione diventerebbe troppo complicata.

Quando usi una stringa magica solo in un contesto, come fai tu, penso che vada bene.
Ma se mai avessi bisogno di usare la chiave in un'altra parte della lezione, vai const.

È possibile abbinare i nomi delle proprietà alle chiavi e utilizzare la riflessione per ottenere il nome per la ricerca.

public string FirstProperty {
get {
    return Dictionary[PropertyName()];
}
set {
    Dictionary[PropertyName()] = value;
}

private string PropertyName()
{
    return new StackFrame(1).GetMethod().Name.Substring(4);
}

Ciò ha l'ulteriore vantaggio di rendere identiche tutte le implementazioni delle tue proprietà, quindi puoi configurarle in Visual Studio come snippet di codice, se lo desideri.

@Joel non vuoi contare su StackFrame. In fodera può rovinarti la giornata quando meno te lo aspetti.

Ma alla domanda:In ogni caso non ha molta importanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top