いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-006 (System.Nullable)

System.Nullable構造体は.NET 2.0から追加された構造体です。
これは、intなどのnullを受け入れる事が出来ない型に対して
nullを許容させるために使用します。


nullを許容するようにするには、宣言時に

int? id;

のようにします。このようにして宣言された場合

id = null;

のようにnullを割り当てる事ができるようになります。
また、Nullableと同様に.NET 2.0で追加された??演算子
は、値がnullの場合にデフォルト値を割り当てること出来るよう
になっています。以下のようにして使用します。

int realId = id ?? -1;

上記の場合、id変数の値がnullの場合は-1がrealIdに割り当てられます。


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;

using Gsf.Research.ClassLibrary;

namespace Gsf.Research.ClassLibrary.System{

    /// <summary>
    /// System.Nullable構造体のサンプルクラスです。
    /// </summary>
    /// <remarks>
    /// System.Nullable構造体は.NET 2.0から追加された構造体です。
    /// これは、intなどのnullを受け入れる事が出来ない型に対して
    /// nullを許容させるために、使用します。
    /// nullを許容するようにするには、宣言時に
    ///
    /// int? id;
    ///
    /// のようにします。このようにして宣言された場合
    ///
    /// id = null;
    ///
    /// のようにnullを割り当てる事ができるようになります。
    ///
    /// また、Nullableと同様に.NET 2.0で追加された??演算子
    /// は、値がnullの場合にデフォルト値を割り当てること出来るよう
    /// になっています。以下のようにして使用します。
    ///
    /// int realId = id ?? -1;
    ///
    /// 上記の場合、id変数の値がnullの場合は-1がrealIdに割り当てられます。
    /// Nullable型で主に使用するプロパティは、以下です。
    /// -HasValue
    /// -Value
    /// </remarks>
    public class NullableResearch00 : IExecutable{
        
        public void Execute(){

            int  normalIntValue   = 100;
            int? nullableIntValue = 100;

            Display(normalIntValue);
            Display(nullableIntValue);

            //
            // normalIntValueには、nullは割り当てられない.
            //
            // 以下はERRORとなる
            //normalIntValue = null;

            //
            // null許容型として宣言したnullableIntValueはnullが割り当てられる.
            //
            nullableIntValue = null;

            Display(normalIntValue);
            Display(nullableIntValue);
        }

        /// <summary>
        /// int型に対するメソッドです。
        /// </summary>
        void Display(int i){
            Console.WriteLine(i);
        }

        /// <summary>
        /// int?(つまりNullable)型に対するDisplayメソッドのオーバーロードです。
        /// </summary>
        void Display(int? i){

            Console.WriteLine("Nullable.HasValue={0}", i.HasValue);

            //
            // Valueプロパティは、値がnullの場合InvalidOperationException
            // をスローします。
            // HasValueで確認するか、??演算子を利用するか、GetValueOrDefaultを利用します。
            //
            if(i.HasValue){
                Console.WriteLine("Nullable.Value={0}", i.Value);
            }
            Console.WriteLine("Nullable.GetValueOrDefault={0}", i.GetValueOrDefault());
            Console.WriteLine("Nullable.??={0}",                i ?? -1);
        }
    }
}


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。