2012-10-22 13 views
6

CA1305 wird ausgelöst, wenn eine Überladung vorliegt, die IFormatProvider erfordert, aber diese Überladung wird nicht im Code verwendet.CA1305: Ausführlichkeit beim Angeben der Kultur

Zum Beispiel wirft der folgende Code diese Warnung:

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

Der offensichtliche Weg dieser Warnung loszuwerden, ist die Kultur angeben, verwendet werden:

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

Aber ich denke, Das ist viel zu ausführlich.

Welche Alternativen gibt es?

Antwort

2

Ziemlich genau die einzige Alternative, die zu einer geringeren Ausführlichkeit führen würde, während das explizite Format des Provider-Passing beibehalten würde, wäre die Verwendung kulturspezifischer Fassadenmethoden. Zum Glück formatiert man normalerweise nur für InvariantCulture und CurrentCulture, sodass für jede zugrunde liegende Formatierungsmethode nur zwei Fassadenmethoden benötigt werden.

Eine typische Fassade Methode für Ihren Beispielcode könnte eine Signatur wie diese:

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

und wie folgt aufgerufen werden:

für die Organisation der Fassade Methoden in Kultur wäre
"{0} - {1}".FormatForInvariantCulture(id, name); 

Ein anderer Ansatz -spezifische Formatierertypen, die mit IoC-Techniken injiziert werden können. Zum Beispiel könnte eine Schnittstelle wie die folgenden für die Formatierung definiert werden:

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

Kulturspezifische Instanzen dann in Typen injiziert werden könnten, die Formatierung mit Konstrukteuren wie folgt ausführen müssen:

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

Unabhängig Bei der Art und Weise wie die Fassadenmethoden gepackt werden, ist es wichtig zu berücksichtigen, dass CA2241 (ProvideCorrectArgumentsToFormattingMethods) die Verwendung der Methoden nicht untersucht. Daher könnte es sich lohnen, eine benutzerdefinierte Regel hinzuzufügen, um dies zu tun.

+0

OK, das ist etwas, was ich selbst gefunden habe, das sieht in meinem Code momentan so aus: 'Format.Invariant (" {0} - {1} ", id, name)' und 'Format.ForUI'. Das Problem ist, dass dies nur "string.Format" löst. Es würde keinen anderen Fall dieser Warnung lösen ... –

+0

Yup. Vermutlich würden Sie für jede häufig aufgerufene Formatierungsmethode Fassadenmethodenpaare erstellen. Wenn Sie diesen Weg gehen, sollten Sie sich darüber im Klaren sein, dass CA2241 ([ProvideCorrectArgumentsToFormattingMethods] (http://msdn.microsoft.com/en-us/library/ms182361.aspx)) die Fassade nicht anzeigt Sie möchten eine benutzerdefinierte Regel hinzufügen, die dies ermöglicht. –

+0

Was halten Sie von einer statischen Klasse 'For' mit zwei Eigenschaften' Invariant' und 'UI'? 'Invariant' würde einfach' CultureInfo.InvariantCulture' zurückgeben und 'UI' würde' CultureInfo.CurrentCulture' zurückgeben. Dies würde zu Code wie diesem führen: 'string.Format (For.Invariant," {0} - {1} ", id, name);' und zusätzlich könnte dies in jedem Szenario verwendet werden, das CA1305 auslöst und das Problem lösen würde mit CA2241. –