Nullable, structure générique

Remarque : cette structure est nouvelle dans le .NET Framework version 2.0.

Représente un objet dont le type sous-jacent est un type valeur qui peut également être assigné référence Null (Nothing en Visual Basic) comme un type référence.

Espace de noms : System
Assembly : mscorlib (dans mscorlib.dll)

[SerializableAttribute] 
public struct Nullable<T> where T : struct
J#  prend en charge l'utilisation de types et de méthodes génériques mais pas la déclaration de nouveaux types et de méthodes génériques.
JScript ne prend pas en charge les types et les méthodes génériques.

Un type est dit nullable s'il est possible de lui assigner une valeur ou de lui assigner référence Null (Nothing en Visual Basic), ce qui signifie qu'il n'a aucune valeur du tout. Par conséquent, un type nullable peut soit exprimer une valeur soit exprimer qu'aucune valeur n'existe. Par exemple, un type référence, tel que String est nullable, alors qu'un type valeur, tel que Int32 ne l'est pas. Un type valeur ne peut pas être nullable parce qu'il a une capacité suffisante pour exprimer uniquement les valeurs appropriées pour ce type ; il n'a pas la capacité supplémentaire requise pour exprimer une valeur Nul.

La structure Nullable prend en charge l'utilisation unique d'un type valeur comme type nullable parce que les types référence sont nullables de conception.

La classe Nullable fournit une prise en charge complémentaire de la structure Nullable. La classe Nullable permet d'obtenir le type sous-jacent d'un type nullable, et les opérations de comparaison et d'égalité sur les paires de types nullables dont le type valeur sous-jacent ne prend pas en charge les opérations de comparaison générique et d'égalité.

Scénario

Utiliser des types nullables pour représenter des choses qui existent ou n'existent pas, selon les circonstances. Par exemple, un attribut facultatif d'une balise HTML peut exister dans une balise, mais pas dans une autre ou une colonne nullable d'une table de base de données peut exister dans une ligne de la table, mais pas dans une autre.

Vous pouvez représenter l'attribut ou la colonne sous la forme d'un champ dans une classe et vous pouvez définir le champ comme un type valeur. Le champ peut contenir toutes les valeurs valides pour l'attribut ou la colonne, mais il ne peut pas contenir de valeur supplémentaire qui signifie que l'attribut ou la colonne n'existe pas. Dans ce cas, définissez le champ comme étant un type nullable au lieu d'un type valeur.

Propriétés fondamentales

Les deux membres fondamentaux de la structure Nullable sont les propriétés HasValue et Value. Si la propriété HasValue d'un objet Nullable est true, la valeur de l'objet est accessible grâce à la propriété Value. Si la propriété HasValue est false, la valeur de l'objet est indéfinie et une tentative d'accès à la propriété Value lève une InvalidOperationException.

Conversion boxing et unboxing

Lorsqu'un type nullable est boxed, le Common Language Runtime effectue automatiquement une conversion boxing de la valeur sous-jacente de l'objet Nullable, et non de l'objet Nullable lui-même. Autrement dit, si la propriété HasValue est true, le contenu de la propriété Value est boxed. Si la propriété HasValue a la valeur false, référence Null (Nothing en Visual Basic) est boxed. Lorsque la valeur sous-jacente d'un type nullable est unboxed, le Common Language Runtime crée une structure Nullable initialisée à la valeur sous-jacente.

L'exemple de code suivant définit trois lignes d'une table dans la base de données exemple Pubs de Microsoft. La table contient deux colonnes qui ne sont pas nullables et deux colonnes qui le sont.

// 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.

*/

Les membres statiques publics (Shared en Visual Basic) de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile pour Pocket PC, Windows Mobile pour Smartphone, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition

Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.

.NET Framework

Prise en charge dans : 2.0

.NET Compact Framework

Prise en charge dans : 2.0

Ajouts de la communauté

AJOUTER
Afficher: