Проверка на null, прежде чем метод toString()



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



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


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



высоко ценится!

575   12  

12 ответов:

обновление 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();
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

Comments

    Ничего не найдено.