Проверка значения 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)