Freigeben über


CA1305: IFormatProvider angeben

TypeName

SpecifyIFormatProvider

CheckId

CA1305

Kategorie (Category)

Microsoft.Globalization

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Eine Methode oder ein Konstruktor ruft einen oder mehrere Member auf, die Überladungen besitzen und einen IFormatProvider-Parameter akzeptieren; die Methode oder der Konstruktor ruft diejenige Überladung nicht auf, die den IFormatProvider-Parameter annimmt.Diese Regel ignoriert Aufrufe von .NET Framework-Methoden, bei denen dokumentiert ist, dass sie den IFormatProvider-Parameter ignorieren, und zusätzlich folgende Methoden:

Regelbeschreibung

Wenn ein CultureInfo-Objekt oder ein IFormatProvider-Objekt nicht angegeben wird, hat der Standardwert, der vom überladenen Member bereitgestellt wird, möglicherweise nicht in allen Gebietsschemas den gewünschten Effekt.Zudem basiert bei .NET Framework-Membern die Auswahl von Standardkultur und Formatierung auf Annahmen, die möglicherweise nicht auf Ihren Code zutreffen.Um sicherzustellen, dass der Code in den vorgesehenen Szenarien das erwartete Verhalten zeigt, sollten Sie sich bei der Angabe kulturspezifischer Daten an die folgenden Richtlinien halten:

  • Wenn der Wert dem Benutzer angezeigt wird, verwenden Sie die aktuelle Kultur.Siehe CultureInfo.CurrentCulture.

  • Wenn der Wert gespeichert wird und Software auf diesen Wert zugreift (wenn er in einer Datei oder Datenbank gespeichert wird), verwenden Sie die nicht variante Kultur.Siehe CultureInfo.InvariantCulture.

  • Wenn Sie den Empfänger des Werts nicht kennen, lassen Sie den Datennutzer oder -anbieter die Kultur angeben.

Beachten Sie, dass CultureInfo.CurrentUICulture nur verwendet wird, um lokalisierte Ressourcen mit einer Instanz der ResourceManager-Klasse abzurufen.

Auch wenn das Standardverhalten des überladenen Members für Ihre Zwecke geeignet ist, ist es besser, die kulturspezifische Überladung aufzurufen, damit der Code selbstdokumentierend und einfacher zu pflegen ist.

Behandeln von Verstößen

Um Verstöße gegen diese Regel zu beheben, verwenden Sie die Überladung, die ein CultureInfo-Objekt oder IFormatProvider-Objekt als Parameter übernimmt, und geben das Argument entsprechend der oben angegebenen Richtlinien an.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn sicher ist, dass die Standardkultur/der Formatanbieter die richtige Wahl darstellt und die Wartbarkeit des Codes keine hohe Entwicklungspriorität darstellt.

Beispiel

Im folgenden Beispiel verursacht BadMethod zwei Verstöße gegen diese Regel.GoodMethod korrigiert den ersten Verstoß, indem die invariante Kultur an Compare übergeben wird, und korrigiert den zweiten Verstoß durch Übergeben der aktuellen Kultur an ToLower, da dem Benutzer string3 angezeigt wird.

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));
            }
        }
    }
}

Das folgende Beispiel veranschaulicht, welche Auswirkung die Standardkultur auf das voreingestellte IFormatProvider-Objekt hat, das vom DateTime-Typ ausgewählt wird.

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);
        }
    }
}

Folgende Ergebnisse werden zurückgegeben:

  

Verwandte Regeln

CA1304: CultureInfo angeben

Siehe auch

Weitere Ressourcen

Verwenden der CultureInfo-Klasse