CA1303: No pasar literales como parámetros localizados
Nombre de tipo |
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));
}
}
};
}