it-roy-ru.com

Проверка на нулевое значение перед ToString ()

Вот сценарий ... 

if (entry.Properties["something"].Value != null)
  attribs.something = entry.Properties["something"].Value.ToString();

Хотя это эффективно и работает правильно, для меня это выглядит ужасно. Если я не проверяю нулевое значение перед выполнением ToString (), оно выдает исключение, если свойство имеет нулевое значение. Есть ли лучший способ справиться с этим сценарием?

Очень признателен!

74
Dscoduc

Обновите 8 лет спустя (вау!), Чтобы покрыть нулевой оператор c # 6 :

var value = maybeNull?.ToString() ?? ""

Другие подходы:

object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()

Я также использовал это, что не очень умно, но удобно:

public static string ToSafeString(this object obj)
{
    return (obj ?? string.Empty).ToString();
}
118
Rex M

Если вы ориентируетесь на .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();
41
Dale Ragan
Convert.ToString(entry.Properties["something"].Value);
38
Vahid

Добавление пустой строки к объекту является распространенной идиомой, которая позволяет вам делать нулевое безопасное преобразование ToString, например так:

attribs.something = ""+entry.Properties["something"].Value;

Когда entry.Properties["something"].Value равен null, он спокойно возвращает пустую string.

Правка: Начиная с C # 6 вы можете использовать оператор ?., чтобы избежать проверки null еще более простым способом:

attribs.something = entry.Properties["something"].Value?.ToString();
//                                                     ^^
3
dasblinkenlight

Вы не можете сделать:

attribs.something = entry.Properties["something"].Value as string;
2
NotDan
attribs.something = String.Format("{0}", entry.Properties["something"].Value);

Не уверен насчет производительности, хотя ...

2
user645280

Можно ли как-то сделать что-то вроде ответ Дейла Рагана выше , но переопределить ToString () вместо создания нового метода NullSafeToString ()? Я хотел бы, чтобы это (или возвращение «ноль») было поведением по умолчанию. Компилятор (Visual C # 2010 Express) не жалуется, когда я добавляю следующий метод в открытый статический класс ObjectExtensions, но метод не вызывается ...

public static String ToString(this Object obj)
{
    if (obj == null)
    {
        return "null";
    }
    else
    {
        return obj.GetType().Name;
    }
}
1
Dave the Rave
attribs.something  = string.Format("{0}",entry.Properties["something"].Value)
1
aljj

В C # 6.0 вы можете сделать это очень элегантно:

attribs.something = entry.Properties["something"].Value?.ToString();

А вот статья о новом нуль-условный оператор .

1
ZuoLi

Как вариант ответа RexM:

attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()

Единственным недостатком будет то, что attribs.something будет присвоено значение (само по себе, в этом примере), даже если entry.Properties ["что-то"]. Значение было равно нулю - что может быть дорого, если свойство .something выполнит какую-то другую обработку и/или эта строка выполняет много (как в цикле).

1
PhilChuang

Чтобы сделать именно то, что вы пытаетесь сделать, всегда можно использовать вспомогательный метод:

CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);

void CopyIfNotNull(string src, out string dest)
{
  if(src != null)
    dest = src;
}
1
Mike Hall

Как насчет использования вспомогательного метода, подобного этому:

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)

0
Zach Scrivena