Udostępnij za pośrednictwem


CA1303: Nie należy przekazywać literałów jako parametrów zlokalizowanych

TypeName

DoNotPassLiteralsAsLocalizedParameters

CheckId

CA1303

Kategoria

Microsoft.Globalization

Złamanie zmiany

Bez podziału

Przyczyna

Metoda przekazuje ciąg literału jako parametr do konstruktora lub metody w .NET Framework klasy biblioteki i ciąg należy lokalizowalny.

To ostrzeżenie jest wywoływane, gdy literału string jest przekazywana jako wartość parametru lub właściwości i jest spełniony jeden lub więcej z następujących przypadków:

  • LocalizableAttribute Atrybut parametru lub właściwość jest ustawiona na wartość true.

  • Nazwa parametru lub właściwości zawiera "Tekst", "Wiadomości" lub "Tytuł".

  • Nazwa parametru ciąg, który jest przekazywany do metody Console.Write lub Console.WriteLine jest "wartość" lub "format".

Opis reguły

Literały ciągów znaków, które są osadzone w kodzie źródłowym są trudne do zlokalizowania.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy zastąpić literał ciągu znaków ciąg pobierane za pośrednictwem instancji ResourceManager klasy.

Kiedy do pomijania ostrzeżenia

Bezpiecznie pomija ostrzeżenia, od tej reguły biblioteki kodu nie jest lokalizowany lub ciąg nie jest narażony na użytkownika końcowego lub autora, przy użyciu biblioteki kodu.

Użytkowników można wyeliminować hałasu przeciwko metod, które nie powinny być przekazywane zlokalizowane ciągi albo zmiana nazwy parametru lub właściwości o nazwie lub oznakowania te elementy jako warunkowe.

Przykład

W poniższym przykładzie metoda, która zgłasza wyjątek w przypadku, gdy albo jej dwa argumenty są poza zakresem.Dla pierwszego argumentu konstruktora wyjątek jest przekazywany literału ciągu, który narusza tej reguły.Dla drugiego argumentu konstruktora jest poprawnie przekazany ciąg pobranych za pośrednictwem ResourceManager.

Imports System
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Imports System.Windows.Forms


<assembly: System.Resources.NeutralResourcesLanguageAttribute("en-US")>
Namespace GlobalizationLibrary

    Public Class DoNotPassLiterals

        Dim stringManager As System.Resources.ResourceManager

        Sub New()
            stringManager = New System.Resources.ResourceManager( _
                "en-US", System.Reflection.Assembly.GetExecutingAssembly())
        End Sub 

        Sub TimeMethod(hour As Integer, minute As Integer)

            If(hour < 0 Or hour > 23) Then
                MessageBox.Show( _
                    "The valid range is 0 - 23.") 'CA1303 fires because the parameter for method Show is Text
            End If 

            If(minute < 0 Or minute > 59) Then
                 MessageBox.Show( _
                    stringManager.GetString("minuteOutOfRangeMessage", _
                        System.Globalization.CultureInfo.CurrentUICulture))
            End If 

        End Sub 

    End Class 

End Namespace
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Windows.Forms;



[assembly: NeutralResourcesLanguageAttribute("en-US")]
namespace GlobalizationLibrary
{
    public class DoNotPassLiterals
    {
        ResourceManager stringManager;
        public DoNotPassLiterals()
        {
            stringManager =
            new ResourceManager("en-US", Assembly.GetExecutingAssembly());
        }

        public void TimeMethod(int hour, int minute)
        {
            if (hour < 0 || hour > 23)
            {
                MessageBox.Show(
                "The valid range is 0 - 23."); //CA1303 fires because the parameter for method Show is Text
            }

            if (minute < 0 || minute > 59)
            {
                MessageBox.Show(
                stringManager.GetString(
                "minuteOutOfRangeMessage", CultureInfo.CurrentUICulture));
            }
        }
    }

}
using namespace System;
using namespace System::Globalization;
using namespace System::Reflection;
using namespace System::Resources;
using namespace System::Windows::Forms;

[assembly: NeutralResourcesLanguageAttribute("en-US")];
namespace GlobalizationLibrary
{
    public ref class DoNotPassLiterals
    {
        ResourceManager^ stringManager;

    public:
        DoNotPassLiterals()
        {
            stringManager = 
                gcnew ResourceManager("en-US", Assembly::GetExecutingAssembly());
        }

        void TimeMethod(int hour, int minute)
        {
            if(hour < 0 || hour > 23)
            {
                MessageBox::Show(
                    "The valid range is 0 - 23."); //CA1303 fires because the parameter for method Show is Text
            }

            if(minute < 0 || minute > 59)
            {
                MessageBox::Show(
                    stringManager->GetString("minuteOutOfRangeMessage", CultureInfo::CurrentUICulture));
            }
        }
    };
}

Zobacz też

Koncepcje

Zasoby w aplikacjach klasycznych