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));
}
}
};
}