CA1303: não passar literais como parâmetros localizados
TypeName |
DoNotPassLiteralsAsLocalizedParameters |
CheckId |
CA1303 |
Categoria |
Microsoft.Globalization |
Alteração Significativa |
Sem Quebra |
Causa
Um método envia uma cadeia literal como um parâmetro a um construtor o método ou na biblioteca de classes de .NET Framework e na cadeia de caracteres deve ser localizável.
Esse aviso é gerado quando uma cadeia de caracteres literal é passado como um valor em um parâmetro ou a uma propriedade e um ou mais dos seguintes casos são verdadeiras:
O atributo de LocalizableAttribute de parâmetro ou da propriedade for definido para retificar.
O nome do parâmetro ou da propriedade contém o texto”, “a “, mensagem” ou “legenda”.
O nome do parâmetro de cadeia de caracteres que é passado para um método de Console.Write ou de Console.WriteLine é “valor” ou “formato”.
Descrição da Regra
Literais de cadeia de caracteres que são inseridas no código-fonte são difíceis de ser localizado.
Como Corrigir Violações
Para corrigir uma violação desta regra, substituir a cadeia literal com uma cadeia de caracteres recuperada por uma instância da classe de ResourceManager .
Quando Suprimir Alertas
É seguro suprimir um aviso dessa regra se a biblioteca de código não será localizada, ou se a cadeia de caracteres não é exposto ao usuário final ou a um desenvolvedor que usa a biblioteca de códigos.
Os usuários podem eliminar o ruído nos métodos que não devem ser transmitidos localizar cadeias de caracteres ou renomeando o parâmetro ou a propriedade denominada, ou marcando esses itens como anteriores.
Exemplo
O exemplo a seguir mostra um método que gerencie uma exceção quando qualquer um dos dois argumentos está fora do intervalo.Para o primeiro argumento, o construtor de exceção é passado uma cadeia de caracteres literal, que viola esta regra.Para o segundo argumento, o construtor é passado corretamente uma cadeia de caracteres recuperada com 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));
}
}
};
}