Поделиться через


Не следует жестко кодировать строки, зависящие от языка

Обновлен: Ноябрь 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));
      }
   }
}