C # è meglio usare una stringa o un enum come chiave?

1

Esempio 1 (utilizzato al momento)

If (BodyPart["Right Leg"].BodyStatusEffects["Active"].Active)
{
    BodyPart["Right Leg"].BodyStatusImpacts["Poisoned"].Active = false;

    BodyPart["Torso"].BodyStatusImpacts["Poisoned"] = 
        BodyPart["Right Leg"].BodyStatusImpacts["Poisoned"];

    BodyPart["Right Foot"].BodyStatusImpacts["Poisoned"] = 
        BodyPart["Right Leg"].BodyStatusImpacts["Poisoned"];
}

Esempio 2

BodyPart.[BodyParts.RightLegs].BodyStatusImpacts["Poisoned"].Active = false;

Quale di questi due esempi è il metodo preferito? C'è un terzo modo che è ancora meglio?

    
posta Cold ice programer 17.05.2017 - 14:53
fonte

2 risposte

5

In genere raccomando di usare l'enumerazione in questa situazione. Motivi:

  • Definisce in modo molto chiaro cosa è permesso e cosa non è permesso nelle strutture che sono codificate con loro, se si definisce il tipo enum come la chiave.
  • Probabilmente l'IDE ti fornirà funzionalità di completamento automatico più semplice e veloce rispetto alla digitazione di un preventivo aperto, alla digitazione di una stringa, quindi a un preventivo di chiusura.
  • Se hai sempre bisogno di generare un elenco di tutte le chiavi utilizzate nel tuo programma, è molto più facile scorrere su un enumerico che cercare tutti i riferimenti alla struttura dati sottostante e trovare quindi tutte le diverse chiavi stringa che hai usato.
  • È relativamente facile digitare la chiave sbagliata come chiave e perdere tempo a cercare di capire perché il tuo programma non funzionerà. Non posso fare lo stesso errore con un enum.
  • Se hai mai bisogno di modificare un valore enum, il tuo IDE probabilmente ti permetterà di refactarlo molto facilmente. Con le stringhe come chiavi, farai un sacco di ricerca e sostituzione sul testo e spero che tu abbia capito tutto.

Un problema con l'enumerazione è che non è possibile aggiungere nuovi valori a un enum in fase di esecuzione (almeno non so in alcun modo a), quindi se il programma dovrà essere in grado di creare chiavi completamente nuove basate sull'input dell'utente in fase di esecuzione, l'enumerazione non può aiutarti. Ma potresti inserire la tua struttura dati con le enumerazioni "soft" (i valori stringa delle enumerazioni) e le stringhe inserite dall'utente per ottenere una sorta di soluzione ibrida.

    
risposta data 17.05.2017 - 16:24
fonte
3

Non vedo qui il codice che usa enum come chiave. Se speri nella sicurezza del tipo non è questo il modo per trovarlo.

Si consideri:

Dictionary<SomeEnum, SomeClass> aDictionary = new Dictionary<SomeEnum, SomeClass>();

aDictionary[SomeEnum.RightLeg]

La limitazione qui è ora che le chiavi devono essere conosciute staticamente. Non è consentito introdurre subdole chiavi arbitrarie e utilizzarle per trovare le cose in un secondo momento. Ci sono casi in cui l'utilizzo di stringhe come chiavi è molto utile. Ma devi stare attento ai problemi di unicità e errori di battitura che l'enum si prenderà cura di te.

Quando usi un codice come:

BodyPart[BodyParts.RightLegs.ToString()]

stai ricevendo una stringa in scatola. Sta usando enum per ottenere una stringa da usare come chiave. Chiunque è libero di inviare una stringa letterale in quel dizionario in qualsiasi momento. Forse è abbastanza buono per te, ma non sta usando enum come chiave. Non stai ricevendo la sicurezza del tipo.

    
risposta data 17.05.2017 - 16:34
fonte

Leggi altre domande sui tag