Проверка на нулевое значение перед ToString () - PullRequest
74 голосов
/ 15 февраля 2009

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

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

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

Очень ценится!

Ответы [ 12 ]

121 голосов
/ 15 февраля 2009

Обновление 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();
}
41 голосов
/ 15 февраля 2009

Если вы ориентируетесь на .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();
38 голосов
/ 25 января 2011
Convert.ToString(entry.Properties["something"].Value);
3 голосов
/ 12 сентября 2013

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

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

Когда entry.Properties["something"].Value равно null, это тихо возвращает пустое значение string.

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

attribs.something = entry.Properties["something"].Value?.ToString();
//                                                     ^^
2 голосов
/ 04 марта 2011
attribs.something = String.Format("{0}", entry.Properties["something"].Value);

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

2 голосов
/ 26 апреля 2009

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

attribs.something = entry.Properties["something"].Value as string;
1 голос
/ 09 февраля 2016

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

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

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

1 голос
/ 04 марта 2011

Возможно ли как-то сделать что-то вроде Ответ Дейла Рагана выше , но переопределение 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 голос
/ 07 октября 2010
attribs.something  = string.Format("{0}",entry.Properties["something"].Value)
1 голос
/ 15 февраля 2009

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

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

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