Esporta (0) Stampa
Espandi tutto
Questo argomento non è stato ancora valutato - Valuta questo argomento

Nullable (struttura generica)

Rappresenta un oggetto il cui tipo sottostante è un tipo di valore a cui è anche possibile assegnare riferimento null (Nothing in Visual Basic) come tipo di riferimento.

Spazio dei nomi: System
Assembly: mscorlib (in mscorlib.dll)

[SerializableAttribute] 
public struct Nullable<T> where T : struct
J# supporta l'utilizzo di tipi e metodi generici ma non la dichiarazione di nuovi.
JScript non supporta tipi e metodi generici.
Non applicabile.

Parametri di tipo

T

Tipo di valore sottostante del tipo generico Nullable.

Un tipo viene definito nullable se è possibile assegnare a esso un valore o riferimento null (Nothing in Visual Basic), che significa che il tipo non presenta alcun valore. Di conseguenza, un tipo nullable può esprimere un valore oppure esprimere che non è presente alcun valore. Ad esempio, un tipo di riferimento quale String è nullable, a differenza di un tipo di valore quale Int32. Un tipo di valore non può essere nullable poiché dispone di capacità sufficiente a esprimere solo i valori appropriati per tale tipo, non dispone della capacità aggiuntiva richiesta per esprimere un valore null.

La struttura Nullable supporta l'utilizzo di un solo tipo di valore come tipo nullable poiché i tipi di riferimento sono nullable in base alla progettazione.

La classe Nullable fornisce supporto complementare per la struttura Nullable. La classe Nullable supporta la possibilità di ottenere il tipo sottostante di un tipo nullable e le operazioni di confronto e di uguaglianza su coppie di tipi nullable il cui tipo di valore sottostante non supporta le operazioni di confronto e di uguaglianza generiche.

Scenario

Utilizzare i tipi nullable per rappresentare elementi presenti o meno a seconda della circostanza. Ad esempio, un attributo facoltativo di un tag HTML può essere presente in un tag ma non in un altro oppure una colonna nullable di una tabella di database può essere presente in una riga ma non in un'altra.

È possibile rappresentare l'attributo o la colonna come campo in una classe e definire il campo come tipo di valore. Il campo può contenere tutti i valori validi per l'attributo o per la colonna, ma non può supportare un valore aggiuntivo che indica che l'attributo o la colonna non è presente. In questo caso, definire il campo come tipo nullable anziché come tipo di valore.

Proprietà fondamentali

I due membri fondamentali della struttura Nullable sono le proprietà HasValue e Value. Se la proprietà HasValue per un oggetto Nullable è true, è possibile accedere al valore dell'oggetto con la proprietà Value. Se la proprietà HasValue è false, il valore dell'oggetto non viene definito e il tentativo di accesso alla proprietà Value genera un'eccezione InvalidOperationException.

Boxing e unboxing

Quando un tipo nullable è boxed, Common Language Runtime esegue automaticamente il boxing del valore sottostante dell'oggetto Nullable, non dell'oggetto Nullable stesso. Se la proprietà HasValue è true, quindi, il contenuto della proprietà Value sarà boxed. Quando il valore sottostante di un tipo nullable è unboxed, Common Language Runtime crea una nuova struttura Nullable inizializzata sul valore sottostante.

Se il valore della proprietà HasValue di un tipo nullable è false, il risultato di un'operazione di boxing sarà riferimento null (Nothing in Visual Basic). Di conseguenza, se un tipo nullable boxed viene passato a un metodo che prevede un argomento dell'oggetto, sarà necessario preparare tale metodo per gestire i casi in cui l'argomento è riferimento null (Nothing in Visual Basic). Quando riferimento null (Nothing in Visual Basic) è unboxed in un tipo nullable, Common Language Runtime crea una nuova struttura Nullable e inizializza la relativa proprietà HasValue su false.

Nell'esempio di codice riportato di seguito vengono definite tre righe di una tabella nel database di esempio Microsoft Pubs. La tabella contiene due colonne non nullable e due colonne nullable.

// This code example demonstrates the Nullable<T> class.
// The code example defines a database table in which two columns 
// are nullable. In the application, an array of rows is created 
// and initialized. The table rows could subsequently be 
// written to a database.

using System;

class Sample 
{
// Define the "titleAuthor" table of the Microsoft "pubs" database. 
    public struct titleAuthor 
    {
    // Author ID; format ###-##-####
    public string au_id;
    // Title ID; format AA####
    public string title_id;
    // Author ORD is nullable.
    public short? au_ord;
    // Royalty Percent is nullable.
    public int? royaltyper;
    }

    public static void Main() 
    {
// Declare and initialize the titleAuthor array.
    titleAuthor[] ta = new titleAuthor[3];
    ta[0].au_id = "712-32-1176";
    ta[0].title_id = "PS3333";
    ta[0].au_ord = 1;
    ta[0].royaltyper = 100;
  
    ta[1].au_id = "213-46-8915";
    ta[1].title_id = "BU1032";
    ta[1].au_ord = null;
    ta[1].royaltyper = null;

    ta[2].au_id = "672-71-3249";
    ta[2].title_id = "TC7777";
    ta[2].au_ord = null;
    ta[2].royaltyper = 40;

// Display the values of the titleAuthor array elements, and 
// display a legend.
    Display("Title Authors Table", ta);
    Console.WriteLine("Legend:");
    Console.WriteLine("An Author ORD of -1 means no value is defined.");
    Console.WriteLine("A Royalty % of 0 means no value is defined.");
    }

// Display the values of the titleAuthor array elements.
    public static void Display(string dspTitle, 
                               titleAuthor[] dspAllTitleAuthors)
    {
    Console.WriteLine("*** {0} ***", dspTitle);
    foreach (titleAuthor dspTA in dspAllTitleAuthors)
       {
       Console.WriteLine("Author ID ... {0}", dspTA.au_id);
       Console.WriteLine("Title ID .... {0}", dspTA.title_id);
       Console.WriteLine("Author ORD .. {0}", dspTA.au_ord ?? -1);
       Console.WriteLine("Royalty % ... {0}", dspTA.royaltyper ?? 0);
       Console.WriteLine();       
       }
    }
}

/*
This code example produces the following results:

*** Title Authors Table ***
Author ID ... 712-32-1176
Title ID .... PS3333
Author ORD .. 1
Royalty % ... 100

Author ID ... 213-46-8915
Title ID .... BU1032
Author ORD .. -1
Royalty % ... 0

Author ID ... 672-71-3249
Title ID .... TC7777
Author ORD .. -1
Royalty % ... 40

Legend:
An Author ORD of -1 means no value is defined.
A Royalty % of 0 means no value is defined.

*/

I membri statici pubblici (Shared in Visual Basic) di questo tipo sono validi per le operazioni multithreading. I membri di istanza non sono garantiti come thread safe.

Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile per Pocket PC, Windows Mobile per Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

Microsoft .NET Framework 3.0 è supportato in Windows Vista, Microsoft Windows XP SP2 e Windows Server 2003 SP1.

.NET Framework

Supportato in:

.NET Compact Framework

Supportato in:

XNA Framework

Supportato in:
Il documento è risultato utile?
(1500 caratteri rimanenti)
Grazie per i commenti inviati.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft. Tutti i diritti riservati.