2012-10-22 15 views
6

CA1305 jest wywoływana, gdy istnieje przeciążenie, które wymaga IFormatProvider, ale to przeciążenie nie jest używane w kodzie.CA1305: Szczegółowość podczas określania kultury

Na przykład, następujący kod podnosi to ostrzeżenie:

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

Oczywistym sposobem, aby pozbyć się tego ostrzeżenia jest określenie kultury do stosowania:

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

Myślę jednak, to jest zbyt gadatliwe.

Jakie alternatywy istnieją?

Odpowiedz

2

Prawie jedyna alternatywa, która doprowadziłaby do zmniejszenia gadatliwości przy jednoczesnym zachowaniu jawnego przekazywania dostawcy formatu, polegałaby na zastosowaniu metod fasadowych charakterystycznych dla danej kultury. Na szczęście, jeden typowo formatuje tylko InvariantCulture i CurrentCulture, więc tylko dwie metody fasadowe byłyby wymagane dla każdej bazowej metody formatowania.

Typowa metoda fasada dla przykładowego kodu może mieć podpis takiego:

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

i nazywać następująco:

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

Innym podejściem do organizowania metod elewacyjnych byłoby w kulturze specyficzne typy formaterów, które można wtryskiwać za pomocą technik IoC. Na przykład, interfejs jak poniżej może być zdefiniowany dla formatów:

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

Kultura specyficzne przykłady może być następnie wstrzykiwany do typów, które trzeba wykonać formatowane z użyciem konstruktory jak następuje:

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

Niezależnie sposobu pakowania metod fasady, należy wziąć pod uwagę, że CA2241 (ProvideCorrectArgumentsToFormattingMethods) nie będzie badać użycia metod, dlatego warto rozważyć dodanie niestandardowej reguły, aby to zrobić.

+0

OK, to coś, co wymyśliłem sobie, wygląda to teraz w moim kodzie: 'Format.Invariant (" {0} - {1} ", id, nazwa)' i 'Format.ForUI'. Problem polega na tym, że rozwiązuje to tylko 'string.Format'. To nie rozwiąże żadnego innego przypadku tego ostrzeżenia ... –

+0

Yup. Prawdopodobnie zakończyłbyś tworzenie par metod fasady dla każdej metody formatowania, którą często wywołujesz. Ponadto, jeśli przejdziesz tę trasę, powinieneś wiedzieć, że CA2241 ([ProvideCorrectArgumentsToFormattingMethods] (http://msdn.microsoft.com/en-us/library/ms182361.aspx)) nie wyświetli ekranu fasady, więc możesz chcesz rozważyć dodanie niestandardowej reguły, która będzie. –

+0

Co sądzisz o klasie statycznej 'For' z dwiema własnościami' Invariant' i 'UI'? 'Invariant' po prostu zwróci' CultureInfo.InvariantCulture', a 'UI' zwróci' CultureInfo.CurrentCulture'. Doprowadziłoby to do kodu takiego jak to: 'string.Format (For.Newariant," {0} - {1} ", id, name);' i dodatkowo może być użyte w każdym scenariuszu, który podnosi CA1305 i rozwiązuje problem z CA2241. –

Powiązane problemy