Condividi tramite


CA1303: Non passare valori letterali come parametri localizzati

TypeName

DoNotPassLiteralsAsLocalizedParameters

CheckId

CA1303

Category

Microsoft.Globalization

Breaking Change

Non sostanziale

Causa

Un metodo passa un valore letterale stringa come parametro a un costruttore o a un metodo nella libreria di classi .NET Framework e questa stringa deve essere localizzabile.

Questo avviso viene generato quando una stringa letterale passata come un valore a un parametro o proprietà e uno o più dei casi seguenti è true:

  • L'attributo LocalizableAttribute del parametro o proprietà è impostato su true.

  • Il parametro o il nome della proprietà contiene "Testo", "Messaggio" o "Barra del titolo."

  • Il nome del parametro di stringa passato a un metodo Console.Write o Console.WriteLine è "valore" o "formato."

Descrizione della regola

Le stringhe letterali incorporate nel codice sorgente sono difficili da localizzare.

Come correggere le violazioni

Per correggere una violazione di questa regola, sostituire la stringa letterale con una stringa recuperata attraverso un'istanza della classe ResourceManager.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura se la libreria di codice non verrà localizzata o se la stringa non è esposta all'utente finale o a uno sviluppatore che utilizza la libreria di codice.

Gli utenti possono eliminare le segnalazioni sui metodi a cui non devono essere passate stringhe localizzate rinominando il parametro o la proprietà indicata o contrassegnando questi elementi come condizionali.

Esempio

Nell'esempio riportato di seguito viene illustrato un metodo che genera un'eccezione quando uno dei due argomenti relativi non è compreso nell'intervallo. Per il primo argomento, il costruttore di eccezioni viene passato come stringa letterale, violando questa regola. Per il secondo argomento, il costruttore è passato correttamente come una stringa recuperata tramite un oggetto 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));
            }
        }
    };
}

Vedere anche

Concetti

Risorse nelle applicazioni