Делает .У NET есть способ преобразовать нулевую строку в String .Пустой?

StackOverflow https://stackoverflow.com/questions/1241112

  •  12-09-2019
  •  | 
  •  

Вопрос

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

Единственный способ, которым я мог бы использовать его, - это как статический метод в классе string, потому что, очевидно, он не может быть отнесен к экземпляру, поскольку экземпляр равен null, и это вызывает ошибку компилятора.[Править:Ошибка компилятора была вызвана неинициализированной переменной, которую я неверно истолковал]

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

Итак, я полагаю, этот вопрос состоит из двух частей:

  1. Поддерживает ли механизм регулярных выражений .NET framework имеет встроенный способ преобразования нулевой строки в string .Пусто, это общеизвестно, что я где-то упустил по пути?
  2. Если это не так - кто-нибудь знает способ добавить этот метод в качестве статического расширения класса string?

Заранее приветствую

Редактировать:

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

Как вы можете себе представить, 12 строк кода, тесно следующих друг за другом и содержащих синтаксис null coallescing, раздражают глаз, поэтому я перенес операцию null coallescing в метод, чтобы упростить задачу для глаз.Что, однако, идеально, это было бы идеальным расширением к объекту string:

int hashcode =
FirstValue.ResolveNull().GetHashCode() ^
SecondValue.ResolveNull().GetHashCode() ^
...

прочитать более дюжины строк намного легче, чем:

int hashcode =
(FirstValue ?? String.Empty).GetHashCode() ^
(SecondValue ?? String.Empty).GetHashCode() ^
...

Я столкнулся с проблемами компилятора, когда я явно не объявлял свои строковые значения как null, но полагался на неявное:

 string s;

Однако, если вы явно определяете:

string s = null;

Вы можете довольно легко позвонить:

s.ResolveNull();

Спасибо всем за ваш вклад.

Это было полезно?

Решение

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

Методы расширения C # 3.0 могут вызываться для нулевых получателей (поскольку на практике они статичны), но ведут себя как методы экземпляра.Так что просто сделайте это методом расширения.

Другие советы

Я не думаю, что для этого есть что-то встроенное.Моя первая мысль, и то, что я часто делаю, - это использовать оператор coalesce:

string s = null;
string x = s ?? string.Empty;

someExpressionInvolving(ы) ??"");

Нет смысла волноваться по этому поводу string.Empty против "" - разница незначительна:

Console.WriteLine(ReferenceEquals(string.Empty, "")); // true

Способ расширения:

public static class StringExtensions
{
    public static String EmptyIfNull(this String instance)
    {
        return instance ?? String.Empty;
    }
}

конечно, вы можете так же легко написать instance ?? String.Empty в тех местах, где вам нужно использовать String.Пустой вместо null.

string test = CouldReturnNull() ?? string.Empty;

Вы можете использовать ??Оператор (нуль-объединяющий оператор) в C # - это то, что вы имеете в виду?Или я неправильно понял?

например.

string n = null;
string y = n ?? String.Empty;

y было бы = строка.Пусто;

string abc = s ?? string.Empty;

Я бы сказал, что реализация этого как метода расширения была бы немного похожа на то, что мы в Швеции называем "переправиться на другой берег ручья за водой".Когда мне нужно убедиться, что я получу пустую строку вместо null, я часто просто объединяю с string.Empty:

public void SomeMethod(string param)
{
    string notNull = param + string.Empty;
}

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

Для этого нет встроенной функции.Но вы можете написать небольшой метод расширения (или статический ментоход) для строкового типа с оператором типа:

вернуть s ??строка.Emtpy;

Просто добавьте строку.Пустой к любой строковой переменной, и вы гарантированно никогда не получите null

string a = null;
string b = null + string.Empty;
string c = "a" + string.Empty;

(a == string.Empty).Dump(); // False
(b == string.Empty).Dump(); // True
(c == "a").Dump(); // True

Я бросил это в LINQPad, отсюда и .Dump()

Рассматриваю ваши варианты...

Эта техника

string b = null + string.Empty;

генерирует

IL_0001:  ldsfld      System.String.Empty
IL_0006:  dup         
IL_0007:  brtrue.s    IL_000F
IL_0009:  pop         
IL_000A:  ldstr       ""
IL_000F:  stloc.0     

Другой популярный вариант:

string b = null ?? string.empty

генерирует

IL_0001:  ldsfld      System.String.Empty
IL_0006:  stloc.0     

и это

string b = null + "";

генерирует это

IL_0001:  ldstr       ""
IL_0006:  stloc.0     

Я все еще поддерживаю

string b = null + "";

Но на самом деле, ИМО, вы должны просто быть готовы обрабатывать null при переваривании строки

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top