CA1305: Określ IFormatProvider
TypeName |
SpecifyIFormatProvider |
CheckId |
CA1305 |
Kategoria |
Microsoft.Globalization |
Złamanie zmiany |
Bez podziału |
Przyczyna
Metoda lub konstruktora wywołuje jeden lub więcej członków, które mają overloads, które akceptują IFormatProvider parametr oraz metoda lub konstruktora nie wywoływać przeciążenia, który ma IFormatProvider parametru.Ta reguła ignoruje wywołania .NET Framework metod, które są udokumentowane jako ignorowanie IFormatProvider parametru oraz dodatkowo następujące metody:
Opis reguły
Gdy CultureInfo lub IFormatProvider obiektu nie jest podany, domyślną wartość, która jest dostarczana przez członka przeciążony może nie mieć efekt, który ma wszystkich ustawień regionalnych.Ponadto .NET Framework członków wybierz domyślną kulturę i formatowanie oparte na założeniach, które mogą nie być poprawne dla kodu.Aby upewnić się, że kod działa zgodnie z oczekiwaniami dla scenariuszy, należy dostarczyć informacje specyficzne dla kultury zgodnie z następującymi wytycznymi:
Jeśli wartość będzie wyświetlany na ekranie, należy użyć kultury bieżącej.See CultureInfo.CurrentCulture.
Jeśli wartość będą przechowywane i dostęp do oprogramowania (trwała do pliku lub bazy danych), należy użyć Niezmienna kultura.See CultureInfo.InvariantCulture.
Jeśli nie wiesz, przeznaczenia, wartości, mają konsumentem danych lub określić dostawcę, kultury.
Należy zauważyć, że CultureInfo.CurrentUICulture jest używana tylko do pobrania zlokalizowanych zasobów przy użyciu wystąpienia ResourceManager klasy.
Nawet jeśli właściwe dla potrzeb jest domyślne zachowanie przeciążony członka, lepiej jest jawnie wywołać przeciążenie specyficzne dla kultury tak, że kod jest elastycznym i łatwiej utrzymywane w dobrym stanie.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy użyć przeciążenie, który ma CultureInfo lub IFormatProvider i należy określić argument, zgodnie z wytycznymi, które zostały wymienione wcześniej.
Kiedy do pomijania ostrzeżenia
Bezpiecznie Pomiń ostrzeżenie od tej reguły, gdy jest pewne, że dostawca kultury/format domyślny jest poprawny wybór i gdzie łatwość konserwacji kod nie jest priorytetów rozwoju ważne.
Przykład
W poniższym przykładzie BadMethod powoduje, że dwa naruszeń tej reguły.GoodMethodkoryguje pierwszego naruszenia przez przekazanie kulturą niezmienną do Comparei poprawia drugie naruszenie przez przekazanie Bieżąca kultura do ToLower ponieważ string3 jest wyświetlany na ekranie.
using System;
using System.Globalization;
namespace GlobalizationLibrary
{
public class CultureInfoTest
{
public void BadMethod(String string1, String string2, String string3)
{
if(string.Compare(string1, string2, false) == 0)
{
Console.WriteLine(string3.ToLower());
}
}
public void GoodMethod(String string1, String string2, String string3)
{
if(string.Compare(string1, string2, false,
CultureInfo.InvariantCulture) == 0)
{
Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
}
}
}
}
Poniższy przykład pokazuje wpływ Bieżąca kultura w domyślnym IFormatProvider wybranego przez DateTime typu.
using System;
using System.Globalization;
using System.Threading;
namespace GlobalLibGlobalLibrary
{
public class IFormatProviderTest
{
public static void Main()
{
string dt = "6/4/1900 12:15:12";
// The default behavior of DateTime.Parse is to use
// the current culture.
// Violates rule: SpecifyIFormatProvider.
DateTime myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
// Change the current culture to the French culture,
// and parsing the same string yields a different value.
Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
}
}
}
Ten przykład generuje następujące wyniki.