Делает .У NET есть способ преобразовать нулевую строку в String .Пустой?
Вопрос
У меня есть однострочный метод, который преобразует нулевую строку в string .Пустой, который, как я думал, мог бы быть полезен в качестве метода расширения, но я не могу найти полезный способ сделать это так.
Единственный способ, которым я мог бы использовать его, - это как статический метод в классе string, потому что, очевидно, он не может быть отнесен к экземпляру, поскольку экземпляр равен null, и это вызывает ошибку компилятора.[Править:Ошибка компилятора была вызвана неинициализированной переменной, которую я неверно истолковал]
Я думал о добавлении его во вспомогательный класс, но это просто добавляет ненужную сложность с точки зрения возможности обнаружения.
Итак, я полагаю, этот вопрос состоит из двух частей:
- Поддерживает ли механизм регулярных выражений .NET framework имеет встроенный способ преобразования нулевой строки в string .Пусто, это общеизвестно, что я где-то упустил по пути?
- Если это не так - кто-нибудь знает способ добавить этот метод в качестве статического расширения класса 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 при переваривании строки