2016-04-29 15 views
6

Prima di correre a pensare al ?? nullo operatore coalescenza:1 modo lineare, bello e pulito per assegnare un valore se null in C#?

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

Il problema è quando se mioGenitore o objProperty sono nulli, allora sarà un'eccezione prima ancora di raggiungere la valutazione dei strProperty.

per evitare le seguenti verifiche nulli aggiuntivi:

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

io generalmente usare qualcosa di simile a questo:

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

Quindi, se l'oggetto è nullo allora ne crea uno nuovo solo per essere in grado di accedere alla proprietà.

Quale non è molto pulito.

Vorrei qualcosa come un '???' operatore:

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

... che sarebbe sopravvissuto qualunque "null" da dentro la parentesi per tornare invece il valore di default.

Grazie per i suggerimenti.

+4

sguardo al C# 6, il .' operatore '?. – Luaan

risposta

11

E l'operatore di propagazione nullo, che viene fornito con C# 6?

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

Esso controlla myParent, objProperty e strProperty per nulla e si assegna il valore predefinito se uno di essi è nullo.

Ho esteso questa funzionalità creando un metodo di estensione che controlla la presenza di vuoto troppo:

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

Dove IfNullOrEmpty è solo:

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

Esattamente! Stavo aspettando una funzione così lunga;) – renzol

Problemi correlati