CA1302: не следует жестко кодировать строки, зависящие от языка
TypeName |
DoNotHardcodeLocaleSpecificStrings |
CheckId |
CA1302 |
Категория |
Microsoft.Globalization |
Критическое изменение |
Не критическое |
Причина
Метод использует строковый литерал, представляющий часть пути к некоторым системным папкам.
Описание правила
Перечисление System.Environment.SpecialFolder содержит члены, ссылающиеся на определенные системные папки. Расположение этих папок может различаться в разных ОС, пользователь может менять расположение этих папок, их имена могут быть локализованы. Примером специальной папки является системная папка; это папка "C:\WINDOWS\system32" в Windows XP или папка "C:\WINNT\system32" в Windows 2000. Метод Environment.GetFolderPath возвращает расположения, связанные с перечислением Environment.SpecialFolder. Расположения, возвращенные методом GetFolderPath, локализованы и соответствуют компьютеру, на котором в данный момент выполняется программа.
Это правило разделяет пути к папкам, извлеченные с помощью метода GetFolderPath, на отдельные уровни каталогов. Каждый строковый литерал сравнивается с маркерами. При совпадении предполагается, что метод создает строку, ссылающуюся на системное расположение, связанное с маркером. В целях обеспечения переносимости программ и возможности их локализации используйте метод GetFolderPath для извлечения расположений системных папок вместо использования строковых литералов.
Устранение нарушений
Чтобы устранить нарушение данного правила, извлеките расположение с помощью метода GetFolderPath.
Отключение предупреждений
Можно безопасно отключать предупреждения этого правила, если строковый литерал не используется для ссылки на одну из системных папок, связанных с перечислением Environment.SpecialFolder.
Пример
В следующем примере строится путь к общей папке приложений, и правило выдает три предупреждения. Затем программа извлекает путь с помощью метода GetFolderPath.
Imports System
Namespace GlobalizationLibrary
Class WriteSpecialFolders
Shared Sub Main()
Dim string0 As String = "C:"
' Each of the following three strings violates the rule.
Dim string1 As String = "\Documents and Settings"
Dim string2 As String = "\All Users"
Dim string3 As String = "\Application Data"
Console.WriteLine(string0 & string1 & string2 & string3)
' The following statement satisfies the rule.
Console.WriteLine(Environment.GetFolderPath( _
Environment.SpecialFolder.CommonApplicationData))
End Sub
End Class
End Namespace
using System;
namespace GlobalizationLibrary
{
class WriteSpecialFolders
{
static void Main()
{
string string0 = "C:";
// Each of the following three strings violates the rule.
string string1 = @"\Documents and Settings";
string string2 = @"\All Users";
string string3 = @"\Application Data";
Console.WriteLine(string0 + string1 + string2 + string3);
// The following statement satisfies the rule.
Console.WriteLine(Environment.GetFolderPath(
Environment.SpecialFolder.CommonApplicationData));
}
}
}
Связанные правила
CA1303: не следует передавать литералы в виде локализованных параметров