2009-06-09 10 views
5

Per i campi .NET e le proprietà che, per definizione, contengono solo un singolo carattere, c'è qualche vantaggio nel definirli come char anziché come stringa? O è un uso scorretto del tipo di dati char?C'è qualche vantaggio nell'usare char invece della stringa per i valori a carattere singolo?

Sto pensando a un campo che può contenere una M o F per il sesso, o una iniziale di mezzo, o un indicatore memorizzato nel database come una Y o una N. In genere li definisco come una stringa, ma io sono chiedendo se dovrei definirli come char invece.

+1

(Interamente tangenziale, ma come suggerimento, eviterei di archiviare il genere come booleano - è inospitabile per le persone di genere, intersessuali e transgender.) –

+0

@Conrad, ti preghiamo di rileggere la domanda. Ho dato tre esempi separati: (1) sesso (non di genere, ma sesso in senso biologico), che può essere M o F; (2) iniziale centrale, che può essere una singola lettera; e (3) un indicatore non specificato, che può essere una Y o una N. La mia domanda non ha nulla a che fare con l'identità di genere. –

+0

@John: Re: (1): Stai ancora escludendo le persone biologicamente intersessuali. Re: il resto: Sì, ecco perché ho detto che era tangenziale. –

risposta

12

Sì, char è il tipo di dati corretto per questo. La regola generale è: scegliere sempre il tipo di dati più ristretto (il più restrittivo) possibile nel contesto. Ciò significa che qualsiasi dato non valido (o fuori range) non sarà accettato se viene inserito per sbaglio, quindi il tuo programma/database diventerà meno incline agli errori.

Per considerarlo da un altro angolo: quando si desidera utilizzare un valore intero nel codice, si crea un array intero di dimensione uno? Certo che no, perché anche se farebbe il lavoro, è piuttosto inutile. vale a dire Confronto:

int[] value = new int[1] { 123 }; 
value[0] = 456; 

a:

int value = 123; 
value = 456; 

Il primo è semplice assurdo, come sono sicuro che si vede. Sicuramente, questo non è così ovvio nel contesto dei database (l'utilizzo è semplice se si sceglie un tipo di dati string), ma penso che l'analogia aiuti a spiegare la logica dietro la scelta.

Inoltre, quando si tratta di manipolare i valori nel codice, si dovrebbe trovare che avere il campo nel tipo di dati più appropriato (ad esempio char) rende leggermente più semplice l'utilizzo in modo appropriato nel codice.

In termini di prestazioni, non immagino che l'utilizzo di string potrebbe comportare un sovraccarico significativo. Ok, quindi occupa marginalmente più memoria, ma probabilmente non è un problema. Tuttavia, ritengo che gli altri motivi che ho appena proposto spieghino il motivo per cui lo dovrebbe scegliere char.

+0

Buon punto sui dati non validi che non ho incluso nella mia risposta. – TheTXI

+2

Sì, ci sono davvero due ragioni principali qui: restrizione e protezione contro i dati non validi. – Noldorin

2

Le stringhe sono matrici di caratteri, quindi a meno che tu non creda che potresti aver bisogno delle proprietà/metodi che accompagnano l'array (come la lunghezza e le funzioni di sottostringa) direi bastone con un carattere, dato che sei sicuro che sia solo un personaggio

4

A Char e un 1 carattere String non differiscono molto, in termini di prestazioni. Il CLR stringerà internamente le stringhe per te, quindi questo è qualcosa da considerare (ma ancora una volta non riesco a immaginare che i benefici in termini di prestazioni sarebbero significativi).

Ricordare che un linguaggio di programmazione è uno strumento utile come astrazione . Crea sempre astrazioni utili. In altre parole io definisco i vostri campi come questo:

enum Gender { Male, Female } 

class Foo 
{ 
    Gender gender; 
    Char middleInitial; 
    Boolean indicator; 
} 

Questa classe è semanticamente prezioso ora perché i tipi di dati indicano il loro uso. Utilizzare sempre lo strumento giusto per il lavoro.

+0

D'accordo con il tuo esempio enum. È certamente molto più ovvio di un singolo char. – Skurmedel

+1

Lo stesso commento va qui (ancor più che per il PO) - i campi binari di genere sono ostili alle persone di genere, intersessuali e transgender. Per favore, non perpetuare questo. Grazie! =) –

1

La classe stringa avrà un sovraccarico. Se si dispone di char, sarà necessario rappresentare vuoto con 0x00 o <space> o qualche altro indicatore sconosciuto?Questo andrà o verrà da un database e quale convenzione userai lì?

Generalmente preferisco enum/bool/semantica nativa nel livello applicazione per questo, la conversione da e verso qualsiasi convenzione di database è richiesta. Dopo tutto Person.Gender == Female e if (!Person.IsDeceased) {} è molto più leggibile e chiaro.

+0

Buona domanda. Nella classe specifica su cui sto lavorando in questo momento, i dati verranno archiviati in un database. La tabella (non il mio disegno) usa il riempimento dello spazio invece dei valori nulli, quindi un singolo carattere spaziale si mapperà direttamente al database. Per altri casi in cui ho bisogno di mantenere un null invece di uno spazio, è un buon punto da considerare. –

+0

aggiunta nota sulla mia preferenza di progettazione personale, che è simile al punto di Angry Hare. –

Problemi correlati