2016-04-29 11 views
6

Прежде чем спешить, чтобы подумать о ?? нуль коалесцирующий оператор:1 линейный, красочный и чистый способ присвоить значение, если null в C#?

string result = myParent.objProperty.strProperty ?? "default string value if strObjProperty is null"; 

Проблема в том, когда ли нулевые myParent или objProperty, то будет сгенерировано исключение, прежде чем даже достигнув оценки strProperty.

Чтобы избежать следующих дополнительных поверок неопределенные:

if (myParent != null) 
{ 
    if (objProperty!= null) 
    { 
     string result = myParent.objProperty.strProperty ?? "default string value if strObjProperty is null"; 
    } 
} 

Я обычно использую что-то вроде этого:

string result = ((myParent ?? new ParentClass()) 
       .objProperty ?? new ObjPropertyClass()) 
       .strProperty ?? "default string value if strObjProperty is null"; 

Таким образом, если объект является пустым, то он создает новый один только, чтобы иметь возможность доступ к собственности.

Это не очень чисто.

Я хотел бы что-то вроде '???' оператор:

string result = (myParent.objProperty.strProperty) ??? "default string value if strObjProperty is null"; 

... который выдержит все, что угодно, «нуль» из скобки, чтобы вместо этого вернуть значение по умолчанию.

Спасибо за советы.

+4

Посмотрите на C# 6, в '.' оператора?. – Luaan

ответ

11

Как насчет оператора нулевого распространения, который поставляется с C# 6?

string result = (myParent?.objProperty?.strProperty) 
       ?? "default string value if strObjProperty is null"; 

myParent Он проверяет, objProperty и strProperty для нулевой и присвоить значение по умолчанию, если любой из них равна нулю.

я продлил эту функцию, создав метод расширения, который проверяет пустые тоже:

string result = (myParent?.objProperty?.strProperty) 
       .IfNullOrEmpty("default string value if strObjProperty is null"); 

Где IfNullOrEmpty просто:

public static string IfNullOrEmpty(this string s, string defaultValue) 
{ 
    return !string.IsNullOrEmpty(s) ? s : defaultValue); 
} 
+0

Точно! Я так долго ждал такой возможности;) – renzol