2012-10-22 14 views
6

CA1305 viene sollevato quando esiste un sovraccarico che richiede un IFormatProvider ma questo sovraccarico non viene utilizzato nel codice.CA1305: Verbosità quando si specifica la coltura

Ad esempio, il seguente codice solleva questo avvertimento:

string.Format("{0} - {1}", id, name); 

Il modo più ovvio per sbarazzarsi di questo avvertimento è quello di specificare la lingua da utilizzare:

string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name); 

Tuttavia, penso questo è troppo verboso.

Quali alternative esistono?

risposta

2

Praticamente l'unica alternativa che porterebbe a una diminuzione della verbosità, pur conservando il passaggio del provider di formato esplicito, sarebbe utilizzare i metodi di facciata specifici della cultura. Fortunatamente, uno solo formati per InvariantCulture e CurrentCulture, quindi solo due metodi di facciata sarebbero necessari per ogni metodo di formattazione sottostante.

Un tipico metodo di facciata per il vostro codice di esempio potrebbe avere una firma come questo:

public static string FormatForInvariantCulture(this string template, params object[] substitutions) 

ed essere chiamato come segue:

"{0} - {1}".FormatForInvariantCulture(id, name); 

Un altro approccio per l'organizzazione dei metodi di facciata sarebbe nella cultura - tipi specifici di formattazione che possono essere iniettati usando le tecniche IoC. Ad esempio, un'interfaccia come la seguente potrebbe essere definito per la formattazione:

istanze
public interface IFormatter 
{ 
    string Format(string template, params object[] substitutions); 
} 

Culture-specifici potrebbero poi essere iniettati in tipi che devono eseguire la formattazione utilizzando costruttori come la seguente:

public SomeClass(IFormatter systemFormatter, IFormatter uiFormatter) 
{ 
    // ... 
} 

Indipendentemente del modo in cui i metodi di facciata sono impacchettati, è importante considerare che CA2241 (ProvideCorrectArgumentsToFormattingMethods) non esaminerà l'utilizzo dei metodi, quindi potrebbe essere utile prendere in considerazione l'aggiunta di una regola personalizzata per farlo.

+0

OK, è una cosa che mi è venuta in mente, al momento appare nel mio codice: 'Format.Invariant (" {0} - {1} ", id, name)' e 'Format.ForUI'. Il problema è che questo risolve solo 'string.Format'. Non risolverebbe nessun altro caso di questo avviso ... –

+0

Sì. Presumibilmente finirai per creare coppie di metodi di facciata per ogni metodo di formattazione che chiami frequentemente. Inoltre, se segui questo percorso, tieni presente che CA2241 ([ProvideCorrectArgumentsToFormattingMethods] (http://msdn.microsoft.com/en-us/library/ms182361.aspx)) non esegue la schermatura della facciata, quindi potresti vuoi prendere in considerazione l'aggiunta di una regola personalizzata che lo farà. –

+0

Cosa ne pensi di una classe statica 'For' con due proprietà' Invariant' e 'UI'? 'Invariant' restituirebbe semplicemente' CultureInfo.InvariantCulture' e 'UI' restituire' CultureInfo.CurrentCulture'. Questo porterebbe a un codice come questo: 'string.Format (For.Invariant," {0} - {1} ", id, name);' e inoltre questo potrebbe essere usato in qualsiasi scenario che solleva CA1305 e risolverebbe il problema con CA2241. –

Problemi correlati