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


CA1820: проверьте наличие пустых строк путем проверки длины строки

TypeName

TestForEmptyStringsUsingStringLength

CheckId

CA1820

Категория

Microsoft.Performance

Критическое изменение

Не критическое

Причина

Строка сравнивается с пустой строкой с помощью метода Object.Equals.

Описание правила

Сравнение строк с помощью свойства String.Length или метода String.IsNullOrEmpty выполняется значительно быстрее, чем сравнение с помощью метода Equals.Это происходит потому, что метод Equals выполняет значительно больше инструкций MSIL, чем метод IsNullOrEmpty. Число инструкций MSIL также превышает количество инструкций, необходимых для извлечения значения свойства Length и сравнения этого значения с нулем.

Следует принять во внимание, что метод Equals и выражение Length == 0 ведут себя по-разному в случае неопределенных строк.При попытке получить значение свойства Length для неопределенной строки среда CLR создает исключение NullReferenceException.При выполнении сравнения неопределенной строки с пустой строкой среда CLR не создает исключение, а сравнение возвращает значение false.Проверка на наличие значения NULL не оказывает существенного влияния на относительную производительность этих двух подходов.При разработке кода для среды .NET Framework 2,0 используйте метод IsNullOrEmpty.Во всех остальных случаях рекомендуется по возможности использовать сравнение Length ==.

Устранение нарушений

Чтобы устранить нарушение данного правила, замените метод сравнения на использование свойства Length и выполните проверку на равенство с неопределенной строкой.При разработке кода для среды .NET Framework 2,0 используйте метод IsNullOrEmpty.

Отключение предупреждений

Отключение предупреждений о нарушении этого правила является безопасным в том случае, если вопросы производительности не являются основным приоритетом.

Пример

В следующем примере демонстрируются различные способы поиска пустой строки.

using System;

namespace PerformanceLibrary
{
   public class StringTester
   {
      string s1 = "test";

      public void EqualsTest()
      {
         // Violates rule: TestForEmptyStringsUsingStringLength. 
         if (s1 == "")
         {
            Console.WriteLine("s1 equals empty string.");
         }
      }

      // Use for .NET Framework 1.0 and 1.1. 
      public void LengthTest()
      {
         // Satisfies rule: TestForEmptyStringsUsingStringLength. 
         if (s1 != null && s1.Length == 0)
         {
            Console.WriteLine("s1.Length == 0.");
         }
      }

      // Use for .NET Framework 2.0. 
      public void NullOrEmptyTest()
      {
         // Satisfies rule: TestForEmptyStringsUsingStringLength. 
         if ( !String.IsNullOrEmpty(s1) )
         {
            Console.WriteLine("s1 != null and s1.Length != 0.");
         }
      }
   }
}