Не следует жестко кодировать строки, зависящие от языка
Обновлен: Ноябрь 2007
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));
}
}
}