Tuesday, 28 April 2020

C# - Nullable type or ? on variable


Nullable<T> type or  ? on variable

Represents a value type that can be assigned null.
It's a nullable value. Structs, by default, cannot be nullable, they must have a value, so in C# 2.0, the Nullable<T> type was introduced to the .NET Framework.
C# implements the Nullable<T> type with a piece of syntactic sugar, which places a question mark after the type name, thus making the previously non-nullable type, nullable.

Explanation 

   //Cannot Be Null
   DateTime
   DateTime dt = null;   // Error: Cannot convert null to 'System.DateTime'
                         //because it is a  non-nullable value type
   //Can Be Null
   DateTime?             //Nullable < DateTime >               
   DateTime? dt = null;  // no problems



Example 1
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Web;
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();
        }
    }
}
// The example displays the following output:
//     *** 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.


No comments:

Post a Comment