2017-08-14 2 views
1

Ich habe diese Klasse.Gibt es in der früheren Version von C# eine sauberere Möglichkeit, Null-Propagierung zu schreiben?

class Property 
{ 
    public int? PropertyId { get; set; } 
}  

Ich habe folgende Aussage, die ich C# 6,0

Property p = null; 
var id = p?.PropertyId.GetValueOrDefault() ?? 0; 

Stellt sich heraus, null Ausbreitung arbeiten in nicht C# 5.0 geschrieben in. Ich schrieb es wie folgt um:

int id = 0; 
if (propertyByAddress != null && propertyByAddress.PropertyId != null) 
{ 
    id = p.PropertyId.Value; 
} 

Es scheint unnötig wortreich. Gibt es einen saubereren Weg, um es in C# 5.0 zu tun?

+1

Das ist soweit ich weiß; ?. war wahrscheinlich mein Lieblings-Feature von C# 6 :) – BradleyDotNET

+3

Warum verwenden Sie 'GetValueOrDefault'? 'p? .PropertyId ?? 0' sollte gleich funktionieren. – juharr

+0

Ich würde eine Erweiterungsmethode vorschlagen, aber das ist wahrscheinlich noch wortwörtlicher (wenn das ein Wort ist) –

Antwort

2

Sie können immer noch GetValueOrDefault in C# 5.0 verwenden, aber ja Ihre Nullprüfung ist notwendig.

int id = 0; 
Property p = null; 

if (p != null) 
    id = p.PropertyId.GetValueOrDefault(); 

Sie könnten auch eine Erweiterungsmethode machen, wie Camilo darauf hingewiesen, wenn Sie das ist „sauberer“ fühlen.

PropertyExtensions.cs

public static int GetPropertyIdValueOrDefault(this Property p) 
{ 
    if (p != null) 
     return p.PropertyId.GetValueOrDefault(); 

    return 0; 
} 

Verbrauch:

Property p = null; 
var id = p.GetPropertyIdValueOrDefault(); 
1

Sie können LINQ und eine Maybe-Monade verwenden. Dadurch können Sie z. B. schreiben

var supSupNameOpt = 
    from employee in employeeOpt 
    from supervisor in employee.ReportsTo 
    from supervisorSupervisor in supervisor.ReportsTo 
    select supervisorSupervisor.Name; 

wäre diese

gleichwertige
var supSupNameOpt = employeeOpt?.ReportsTo?.ReportsTo?.Name; 

So nicht so präzise wie ?., aber viel schöner als die pyramid of doom.

Hier sind einige writeups: https://codewithstyle.info/understand-monads-linq/https://ericlippert.com/2013/04/02/monads-part-twelve/

Und Note, während die meisten Tutorials eine spezielle Maybe<T> Wrapper-Klasse für diese präsentieren, können Sie es mit einfachen alten nulls tun; Siehe meinen Kommentar unten: https://smellegantcode.wordpress.com/2008/12/11/the-maybe-monad-in-c/

+0

Sind Sie sicher, dass Sie? die richtige Frage beantwortet? Das hat absolut nichts mit der Frage zu tun –

+0

@CamiloTerevinto Wissen Sie, was eine 'Maybe'-Monade ist? Es ist eine Standardmethode zur Null-Propagierung in funktionalen Sprachen.Wie hat das mit der Frage nichts zu tun? –

+0

Ich frage mich, wer sprach über funktionale Sprachen ... Dies ist eine einfache POCO ohne LINQ in der Mitte. Auch, wenn überhaupt, das viel mehr wörtlich als ein Doppel wenn ich überprüfe –

1

nicht so hübsch wie ?., aber dies funktionieren würde:

public static class ObjectExtensions 
{ 
    public static Tout N<Tin, Tout>(this Tin val, Func<Tin, Tout> e) 
    { 
     if (val == null) 
      return default(Tout); 

     return e(val); 
    } 
} 

Verbrauch:

var id = Property.N(p => p.PropertyId) ?? 0; 
Verwandte Themen