Compartir a través de


CA1303: No pasar literales como parámetros localizados

TypeName

DoNotPassLiteralsAsLocalizedParameters

Identificador de comprobación

CA1303

Categoría

Microsoft.Globalization

Cambio problemático

No

Motivo

Un método pasa un literal de cadena como parámetro a un constructor o método de la biblioteca de clases de .NET Framework y esa cadena debe ser localizable.

Esta advertencia se desencadena cuando una cadena literal se pasa como un valor a un parámetro o propiedad y uno o varios de los casos siguientes son verdaderos:

  • El atributo LocalizableAttribute del parámetro o propiedad está establecido en true.

  • El parámetro o el nombre de propiedad contiene "Text", "Message" o "Caption".

  • El nombre del parámetro de cadena que se pasa a un método Console.Write o Console.WriteLine es "value" o "format".

Descripción de la regla

Los literales de cadena que se incrustan en el código fuente son difíciles de adaptar.

Cómo corregir infracciones

Para corregir una infracción de esta regla, reemplace el literal de cadena con una cadena recuperada mediante una instancia de la clase ResourceManager.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si la biblioteca de código no se adapta o si la cadena no se expone al usuario final o a un programador que utilice la biblioteca de códigos.

Los usuarios pueden eliminar ruido de los métodos que no deben pasar cadenas localizables ya sea cambiando el nombre del parámetro o de la propiedad, o marcando estos elementos como condicionales.

Ejemplo

El ejemplo siguiente muestra un método que produce una excepción cuando cualquiera de sus dos argumentos está fuera del intervalo.En el primer argumento, se pasa una cadena literal al constructor de excepción, que infringe esta regla.En el segundo argumento, se pasa correctamente al constructor una cadena recuperada mediante 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));
            }
        }
    };
}

Vea también

Conceptos

Recursos de aplicaciones de escritorio