2015-09-22 23 views
6

Ho una (probabilmente) domanda stupida sulla formattazione della visualizzazione dei tipi nullable. Al momento, quando ho bisogno di indicare che un campo di un tipo nullable ha effettivamente un valore nullo, I Codice in questo modo:Un modo più elegante per visualizzare null?

var stringToDisplay = nullableDecimal.HasValue ? nullableDecimal.ToString() : "N/A"; 

o qualche variazione di quel testo di base.

Non penso di poter utilizzare un operatore di coalesce - o almeno non penso che sia l'approccio giusto (correggimi se sbaglio).

Esiste un modo migliore e più efficiente per farlo? Mi sento come se questo codice standard stia infestando sempre di più il mio codebase ...

+0

Quale versione C#? –

+1

Perché non un metodo di estensione generico? –

risposta

11

Il tuo approccio non è male di per sé, ma lei ha ragione circa la vostra preoccupazione per la duplicazione del codice. È possibile risolvere questo problema creando un metodo ausiliario, come ad esempio:

public static class DecimalExtensions 
{ 
    public static string Display(this decimal? value) 
    { 
     return value.HasValue ? value.ToString(): "N/A"; 
    } 
} 

In questo esempio ho creato un metodo di estensione, ma un metodo normale sarebbe anche funzionare bene. Poi si può fare proprio:

var stringToDisplay = nullableDecimal.Display(); 

... che è più bello di leggere e impedisce la miriade di s "N/A" nel codice (e come indicato nei commenti, facilita anche refactoring se mai necessario) .

+2

Stavo solo digitando qualcosa di quasi identico, sul lato positivo, ti dà un singolo posto in cui devi cambiare la stringa "N/A" se hai bisogno di rifattorizzarlo per dire qualcos'altro, come "Nessuno" . –

+0

Grazie, Konamiman - Sono d'accordo che questa è la strada da percorrere. – code4life

+0

Errore di spelling: DecimalExtenstions dovrebbe essere DecimalExtensions. – Polyfun

8

In C# 5 o precedente il tuo codice è probabilmente buono come lo è, anche se potresti sempre estrapolarlo al suo metodo se l'hai cosparso dappertutto.

Considerare inoltre di inserire "N/A" in una costante, nel caso in cui si desideri modificarlo.

Tuttavia, in C# 6 si può cambiare un po ', anche se non sarà possibile ottenere molto meglio:

var stringToDisplay = nullableDecimal?.ToString() ?? "N/A"; 

L'operatore ?. si chiama l'operatore "null-riserva" ed è fondamentalmente una breve sintassi per l'espressione che dovevi iniziare.

Fondamentalmente, la parte della espressione significa questo:

string temp = nullableDecimal != null ? nullableDecimal.ToString() : null; 

anche se l'operatore ?. avrebbe valutare solo la parte prima volta, non due volte, quindi è più simile a questo:

var operand = nullableDecimal; 
string temp = operand != null ? operand.ToString() : null; 

Non è molto importante qui, ma se fosse una chiamata al metodo, potrebbe esserlo.

Per quanto riguarda l'estrazione in un metodo, è sufficiente creare un metodo di estensione:

public static class MyNullableDecimalExtensions 
{ 
    public static string ToDisplayText(this decimal? value) 
    { 
     if (decimal.HasValue) 
      return decimal.Value.ToString(); 
     return "N/A"; 
    } 
} 

io non sono eccessivamente appassionato di sintassi ?: operatore, quindi in un metodo come questo vorrei scrivere il pieno se -indicazione invece.

Poi si potrebbe chiamare in questo modo:

var stringToDisplay = nullableDecimal.ToDisplayText(); 
+0

se potessi accettare le tue e le risposte di Konamiman, lo farei! Grazie per la guida di entrambi - ho finito per usare parti di entrambe le risposte, con molto piacere. – code4life

Problemi correlati