2010-04-13 14 views
30

Sono stato più volte chiesto le seguenti domande in molte interviste .... Ma ancora non riesco a spiegarlo con un esempio semplice ...Quando si dovrebbero usare i tipi nullable in C#?

  1. Quali sono i tipi nullable in C#?
  2. Quando si dovrebbero usare i tipi nullable in C#?
  3. Puoi fare un semplice esempio?

Qualche suggerimento?

+1

possibile duplicato di http://stackoverflow.com/questions/1550909/coding-practices-for-c-nullable-type – Ether

risposta

30

Da Using Nullable Types (C# Programming Guide)

Per un esempio di quando si potrebbe utilizzare un tipo nullable , considerare come una normale variabile booleana può avere due valori: vero e falso. Non esiste il valore che indica "non definito". In molte applicazioni di programmazione, la maggior parte delle interazioni del database, le variabili possono esistere in uno stato non definito . Ad esempio, un campo in un database potrebbe contenere i valori true o falso, ma potrebbe anche non contenere alcun valore . Allo stesso modo, i tipi di riferimento possono essere impostati su null per indicare che non sono stati inizializzati.

+0

ma qualsiasi riferimento (oggetto per esempio) può essere nullo. quindi, invece di inscatolare un 'bool' in' Nullable' perché non lo si inserisce in 'Boolean', mi chiedo ancora perché .. –

17

null indica "nessun valore" o "nessun dato". Si utilizzano i tipi nullable quando "nessun valore" è un valore valido nel contesto di qualsiasi sistema che si designa/utilizza.

int? weightOfCargo = TryGetTruckCargoWeight() 

In questo caso, il tipo nullable indica che TryGetTruckCargoWeight() può restituire null. Il significato di ciò sarebbe che i dati non sono disponibili (forse non c'è un camion, forse non è stato pesato, ecc.).

9

Consideriamo seguente esempio:

Uno strumento dispone di impostazioni specificate tramite l'interfaccia utente. Tuttavia, lo strumento può anche essere eseguito dalla riga di comando e le impostazioni specificate nell'interfaccia utente possono essere sovrascritte tramite la riga di comando. Così il codice è il seguente:

bool? setting1; 

... riga di comando di processo, se l'impostazione specificata fare:

setting1.Value = setting; 

... dopo

if(setting1.HasValue) 
    ui.setting1 = setting1.Value 
4

Ogni volta che si utilizza valori designati per rappresentare un valore nullo:
* Un valore minimo di DateTime per rappresentare un valore di nulla
* -1 per rappresentare un valore non impostato per r un numero intero
quindi un tipo nullable sarebbe una scelta migliore.

1
// to replace 
// if(foo.Id > 0) 
if(foo.Id.HasValue) 
{ 
    Update(foo); 
} 
else 
{ 
    Insert(foo); 
} 
4

come tutti sappiamo ci sono due tipi diversi in C#

• Tipo di refrence
• Tipo di valore
tipo di riferimento può essere rappresentare come valore esistente non (NULL), ma il tipo vaue, tuttavia, non può rappresenta il valore NULL.
Per esempio

Da stringa è tipo di riferimento si può dichiarare nullo

String s=null; //ok

Ma se si tenta di dichiarare tipo valore tale Int32 Null esso produceses errore di compilatore

Int32 i=null; // compiler error

Per rappresentare il valore null in un tipo di valore, è necessario utilizzare un costrutto speciale denominato un tipo nullable. È rappresentato usando? simbolo.

Int32? I=null; //now its ok

Ora scenario quando tipi nullable commanly utilizzati è nella programmazione di database in cui è calss mappa per tabella con colonne nullable.
• Se le colonne sono un tipo di riferimento che è String come (indirizzo e-mail e indirizzo cliente), non c'è alcun problema in quanto è possibile definirlo come nullo in C#
• Ma se le colonne sono di tipo di valore doppio come (saldo del conto del cliente), non è possibile associarlo a C# senza utilizzare i tipi nullable.
Per es
mappe ad un tavolo al cliente in una banca dati //


public class Customer 
{ 
    ... 
    public decimal? AccountBalance; 
} 
+9

@Vijay: string è un tipo di riferimento. Non un tipo di valore – Jehof

+0

Piccola correzione: in realtà ci sono tre diversi tipi. Che dire dei tipi di puntatore? :) http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx –

+0

@Jehof: grazie per aver segnalato errori di battitura –

2

C# dispone di due tipi di tipi di dati. Tipo di valore e tipi di riferimento. La stringa è un tipo di riferimento e int è un tipo di valore. Un tipo di riferimento può essere assegnato con un valore nullo come string s = null;. Ma non è possibile assegnare un valore nullo direttamente a un numero intero. Come int a = null // Quindi, per fare in modo che il tipo di valore accetti un valore nullo, vengono utilizzati i tipi nullable. Per rendere annullabile, un ? viene aggiunto

? a = null;//ok. 
1

Penso che se si parla di scenario del mondo reale quando la tabella di database contiene le colonne nullable in esso e si bisogno di creare DTOS (Transfer Data Objects) come mappatura Db Entity . In tali scenari è necessario ottenere lo stesso identico tipo di mapping di dati nelle classi Entity. Per ottenere tale requisito, i tipi nullable sono davvero molto utili per creare esattamente la stessa mappatura e consentire all'utente di lavorare facilmente in questo senario.

Saluti.

3

Un altro esempio:

immaginare, è necessario creare un metodo GetArticles nel BLL. Questo metodo dovrebbe prendere tali argomenti periodo desiderato Data (from e to argomenti), stringa di ricerca (search argomento) e la categoria di documenti (categoryId argomento). Tutti questi argomenti sono opzionali. Quindi in un caso si desidera definire solo l'argomento from e search, nell'altro argomento solo categoryId.

Per fare questo si può creare un sacco di sovraccarichi per GetArticles metodo con la combinazione necessari argomenti.L'altro modo è definire l'unico metodo GetArticles(DateTime? from, DateTime? to, string search, int? categoryId) per questo. In questo caso se l'argomento è null verrà saltato.

Per causa, so una nuova funzionalità in .NET 4.0 denominata optional parameters and named arguments ma prima era una soluzione piacevole per me.

Problemi correlati