CA1303: Literale nicht als lokalisierte Parameter übergeben
TypeName |
DoNotPassLiteralsAsLocalizedParameters |
CheckId |
CA1303 |
Kategorie |
Microsoft.Globalization |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Eine Methode übergibt ein Zeichenfolgenliteral als Parameter an einen Konstruktor oder eine Methode in der .NET Framework-Klassenbibliothek, und diese Zeichenfolge sollte lokalisierbar sein.
Diese Warnung wird ausgelöst, wenn eine Literalzeichenfolge als Wert an einen Parameter oder eine Eigenschaft übergeben wird und mindestens einer der folgenden Fälle wahr ist:
Das LocalizableAttribute-Attribut des Parameters oder der Eigenschaft ist auf "true" festgelegt.
Der Parameter oder Eigenschaftenname enthält "Text", "Meldung" oder "Beschriftung".
Der Name des Zeichenfolgenparameters, der an eine Console.Write-Methode oder eine Console.WriteLine-Methode übergeben wird, ist entweder "Wert" oder "Format".
Regelbeschreibung
Zeichenfolgenliterale, die in Quellcode eingebettet werden, sind schwierig zu lokalisieren.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ersetzen Sie das Zeichenfolgenliteral durch eine Zeichenfolge, die durch eine Instanz der ResourceManager-Klasse abgerufen wird.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn die Codebibliothek nicht lokalisiert wird oder wenn die Zeichenfolge dem Endbenutzer bzw. einem Entwickler nicht über die Codebibliothek zur Verfügung gestellt wird.
Die Benutzer können Störungen für Methoden beseitigen, an die keine lokalisierten Zeichenfolgen übergeben werden sollten, indem sie den Parameter oder die Eigenschaft umbenennen oder indem sie diese Elemente als bedingt kennzeichnen.
Beispiel
Das folgende Beispiel zeigt eine Methode, die eine Ausnahme auslöst, wenn eines ihrer beiden Argumente außerhalb des Bereichs liegt. Beim ersten Argument wird an den Ausnahmekonstruktor eine Literalzeichenfolge übergeben, die gegen diese Regel verstößt. Beim zweiten Argument wird an den Konstruktor ordnungsgemäß eine durch ResourceManager abgerufene Zeichenfolge übergeben.
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));
}
}
};
}