CA1304: Określ CultureInfo
TypeName |
SpecifyCultureInfo |
CheckId |
CA1304 |
Kategoria |
Microsoft.Globalization |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Metoda lub konstruktor wywołuje element członkowski, który ma przeciążenie, które akceptuje parametr System.Globalization.CultureInfo i metodę lub konstruktor, który nie wywołuje przeciążenia, które wymaga parametru CultureInfo.Ta reguła ignoruje wywołania następujących metod:
Opis reguły
Kiedy obiekt CultureInfo lub System.IFormatProvider nie jest podany, domyślna wartość, która jest dostarczana przez członka przeciążonego, może nie mieć efektu, który pożądasz we wszystkich ustawieniach regionalnych.Ponadto elementy członkowskie .NET Framework wybierają domyślną kulturę i formatowanie w oparciu o założenia, które mogą nie być poprawne dla Twojego kodu.Aby zapewnić, że kod działa zgodnie z oczekiwaniami scenariuszy, powinny zostać dostarczone informacje dotyczące kultury, zgodnie z następującymi wskazówkami:
Jeżeli wartość będzie wyświetlana na ekranie, należy użyć bieżącej kultury.Zobacz CultureInfo.CurrentCulture.
Jeśli wartość będzie przechowywana i dostęp do niej będzie przez oprogramowanie, czyli utrzymywana będzie po stronie pliku lub bazy danych, użyj kultury niezmiennej.Zobacz CultureInfo.InvariantCulture.
Jeśli nie znasz przeznaczenia wartości, konsument lub dostawca danych powinien określić kulturę.
Należy zauważyć, że CultureInfo.CurrentUICulture jest używana tylko do pobrania zlokalizowanych zasobów przy użyciu wystąpienia klasy System.Resources.ResourceManager.
Nawet jeśli zachowanie domyślne przeciążonego elementu członkowskiego jest odpowiednie dla Twoich potrzeb, lepiej jawnie wywołać przeciążenie specyfiki kultury tak, aby kod był samodokumentujący oraz łatwiejszy w utrzymaniu.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy użyć przeciążenia, które przyjmuje CultureInfo lub IFormatProvider i określa argument, zgodnie z wytycznymi, które zostały wymienione wcześniej.
Kiedy pominąć ostrzeżenia
Bezpiecznie jest pominąć ostrzeżenia dotyczące tej reguły, kiedy jest pewne, że domyślny dostawca kultury/formatu jest poprawnym wyborem oraz jeżeli łatwość w utrzymaniu kodu nie jest priorytetem podczas rozwoju.
Przykład
W poniższym przykładzie BadMethod powoduje dwa naruszenia tej reguły.GoodMethod koryguje pierwsze naruszenie poprzez przekazanie kultury niezmiennej do System.String.Compare oraz koryguje drugie naruszenie poprzez przekazanie kultury bieżącej do ToLower ponieważ string3 jest wyświetlane użytkownikowi.
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 kultury bieżącej na domyślny IFormatProvider, który jest wybrany przez typ DateTime.
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.
Powiązane reguły
CA1305: Określ IFormatProvider