2010-07-12 5 views
19

Qual è la migliore pratica per specificare CurrentCulture o InvariantCulture e non specificare affatto la cultura?Quando devo specificare CurrentCulture o InvariantCulture e quando dovrei lasciarlo non specificato?

Da quello che ho letto, se si sta eseguendo la serializzazione, ad esempio, è necessario InvariantCulture come mezzo per specificare una rappresentazione canonica di un valore di dati. Questa è una percentuale relativamente piccola di manipolazioni di stringhe basate sulla cultura.

Trovo lungo, prolisso, e brutto il più delle volte per specificare che ogni volta che faccio, dico:

var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName); 

Tuttavia, il mio team ha recentemente girato FxCop su e ora c'è una spinta a utilizzare sempre CultureInfo OVUNQUE. Qual è la tecnica migliore per combinare brevità, leggibilità e funzionalità?

Qualche buona lettura materiale:

risposta

16

C'è un intrinseco trade-off in gioco qui.

Come minimo, è necessario specificare CultureInfo per utilizzare InvariantCulture ogni volta che si esegue qualcosa all'interno del programma. Ad esempio, l'utilizzo di questo con Serialization impone che la rappresentazione dei dati sia sempre la stessa, quindi non devi preoccuparti dei problemi di internazionalizzazione con i tuoi formati di dati interni.

Detto questo, specificare questo ovunque presenta alcuni vantaggi, soprattutto in termini di forzare l'utente a verificare che lo si gestisca correttamente. Il lavoro interno del programma e il lavoro dell'interfaccia utente devono avere una diversa cultura specificata (a condizione che tu voglia localizzare correttamente la tua applicazione). Di conseguenza, un programma complesso tende a richiedere che questo sia specificato ovunque, in quanto lasciare il "default" è pericoloso al massimo e tende a introdurre bug nel tempo.

Tuttavia, specificando ciò, come si è notato, tende ad aumentare la dimensione del codice e potenzialmente ridurre la leggibilità. Ciò porta al trade-off - leggibilità e manutenibilità tramite codice più breve rispetto a una corretta internazionalizzazione e localizzazione e manutenibilità, essendo più esplicito ovunque.

A mio parere, non esiste una risposta "giusta" qui - in realtà dipende dalla vostra applicazione. Se la tua applicazione riguarda completamente la presentazione e non esegue molta manipolazione dei dati, specialmente non con qualsiasi tipo di archiviazione di file autogestita, l'impostazione della cultura corrente (e della cultura dell'interfaccia utente) può essere una volta valida. Ho scoperto che le applicazioni più complicate tendono a non funzionare altrettanto in questo modo, tuttavia, nel qual caso i suggerimenti di FxCop di specificare questo aspetto sembrano più attraenti.

+1

@Reed Copsey: ho anche scoperto che l'aggiunta ovunque come riflesso FxCop crea bug - diverse volte ho visto casi in cui è stata specificata l'opzione cultura errata. Questo è ovviamente solo un problema educativo, ma è un evento comune quando qualcosa come FxCop ti dice di fare le cose, ma non necessariamente capisci perché. –

+2

@Scott: vero. Ma questo è il caso di tutto nella programmazione - se hai intenzione di usarlo devi capirlo o ti morderà. L'unico modo sensato di fare localizzazione è considerarlo quando scrivi per la prima volta il codice: localizzare un prodotto completato è uno dei peggiori lavori da fare e un ordine di grandezza più costoso di pensarci dall'inizio. –

+0

Non sono d'accordo. Metterei la cultura in tutte le ToString() delle mie classi? Penso che la logica e gli oggetti dovrebbero essere inconsapevoli della cultura. – onof

5

L'impostazione predefinita è già la lingua corrente come inizializzata da Windows. Quindi usare CultureInfo.CurrentCulture in modo esplicito è solo una perdita di tempo. Qualsiasi formato di serializzazione decente (inclusa la serializzazione binaria e la serializzazione XML) serializzerà un DateTime in un modo invariante di cultura.

L'utilizzo di una cultura non predefinita è molto pericoloso. Un thread verrà sempre avviato con la cultura predefinita specificata da Windows e configurata dall'utente quando ha installato Windows. .NET avvia i thread del threadpool tutto il tempo e rischi di ottenere una cultura in quel thread che è diversa dal thread principale. Quale può causare tutti i tipi di problemi sottili. Come avere una SortedList che improvvisamente non viene più ordinata.

Problemi correlati