Проверка значения null перед ToString()
Здесь сценарий...
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();
Эффективен и работает правильно, это выглядит уродливо для меня. Если я не проверю нуль перед выполнением ToString(), он выдает исключение, если свойство было null. Есть ли лучший способ справиться с этим сценарием?
Очень ценно!
Ответы
Ответ 1
Обновите 8 лет спустя (вау!), Чтобы охватить нуль-условный оператор c # 6:
var value = maybeNull?.ToString() ?? String.Empty;
Другие подходы:
object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()
Я также использовал это, что не очень умно, но удобно:
public static string ToSafeString(this object obj)
{
return (obj ?? string.Empty).ToString();
}
Ответ 2
Если вы ориентируетесь на .NET Framework 3.5, самым изящным решением будет метод расширения, на мой взгляд.
public static class ObjectExtensions
{
public static string NullSafeToString(this object obj)
{
return obj != null ? obj.ToString() : String.Empty;
}
}
Затем для использования:
attribs.something = entry.Properties["something"].Value.NullSafeToString();
Ответ 3
Convert.ToString(entry.Properties["something"].Value);
Ответ 4
Добавление пустой строки к объекту - это общая идиома, которая позволяет выполнять нулевое преобразование ToString
, например:
attribs.something = ""+entry.Properties["something"].Value;
Когда entry.Properties["something"].Value
есть null
, это тихо возвращает пустой string
.
Изменить: Начиная с С# 6 вы можете использовать оператор ?.
, чтобы избежать проверки null
еще более простым способом:
attribs.something = entry.Properties["something"].Value?.ToString();
// ^^
Ответ 5
Не можете ли вы сделать:
attribs.something = entry.Properties["something"].Value as string;
Ответ 6
attribs.something = String.Format("{0}", entry.Properties["something"].Value);
Не уверен в производительности, хотя...
Ответ 7
Как вариант ответа RexM:
attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()
Единственный недостаток заключается в том, что атрибуту присваивается значение (сам в этом примере), даже если entry.Properties [ "something" ]. Значение было null - это может быть дорого, если свойство .something некоторая другая обработка и/или эта строка выполняет много (как в цикле).
Ответ 8
Чтобы сделать то же самое, что вы пытаетесь использовать вспомогательный метод, всегда можно использовать:
CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);
void CopyIfNotNull(string src, out string dest)
{
if(src != null)
dest = src;
}
Ответ 9
attribs.something = string.Format("{0}",entry.Properties["something"].Value)
Ответ 10
Как-то можно сделать что-то вроде
Dale Ragan ответить выше, но переопределить ToString() вместо создания нового метода NullSafeToString()? Я бы хотел, чтобы это (или возвращающее "null" ) было поведением по умолчанию. Компилятор (Visual С# 2010 Express) не жалуется, когда добавляю следующий метод к общедоступному статическому классу ObjectExtensions, но метод не вызван...
public static String ToString(this Object obj)
{
if (obj == null)
{
return "null";
}
else
{
return obj.GetType().Name;
}
}
Ответ 11
В С# 6.0 вы можете сделать это очень элегантно:
attribs.something = entry.Properties["something"].Value?.ToString();
И вот статья о новом нуль-условном операторе.
Ответ 12
Как использовать вспомогательный метод:
attribs.something = getString(
entry.Properties["something"].Value,
attribs.something);
static String getString(
Object obj,
String defaultString)
{
if (obj == null) return defaultString;
return obj.ToString();
}
В качестве альтернативы вы можете использовать оператор ??
:
attribs.something =
(entry.Properties["something"].Value ?? attribs.something).ToString();
(обратите внимание на избыточный вызов ToString()
, когда значение null
)