Проверка на null, прежде чем метод toString()
вот сценарий...
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();
в то время как эффективно и работает правильно, это выглядит уродливо для меня. Если я не проверяю значение null перед выполнением ToString (), то он выдает исключение, если свойство было null. Есть ли лучший способ справиться с этим сценарием?
высоко ценится!
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();
добавление пустой строки к объекту является общей идиомой, которая позволяет вам делать 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 = 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; } }
В 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