情報応用演習Ⅰ(2024)

【T2b】新しいNull許容/非許容型(5/6)

プロジェクトタイプC#コンソールアプリ※
プロジェクト名T2b
ソリューション名PIT2
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)

※「コンソールアプリ(.NET Framework)」ではないので注意せよ!

注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業についてはNull許容参照型を参照せよ.

2b-5. 参照型の初期値

Null許容参照型はクラスのフィールドやプロパティにも使用可能である.これに伴って通常の,Null許容ではない 参照型のフィールドやプロパティの初期値について注意する必要がある

ためしに,Program.csの末尾にチュートリアル【T2a】で使用したStudentクラスを追記してみよう. 以前は説明しなかったが,実はよく見ると_に示す通り Nameプロパティの部分に警告が表示されている のが確認できるはずである.

記述結果

変数やクラスのフィールド/プロパティは明示的な初期化を行わないこともできるが,その場合はその型のデフォルト値で初期化される. int 型や double 型であればデフォルト値はゼロであるが,上記のNameプロパティのような参照型の場合,デフォルト値は null となる. Null許容であろうとなかろうと参照型であればデフォルト値は null となってしまうので,Null許容ではない普通の参照型には null ではない 何らかの値を必ず初期値としてセットしなければならない_の警告の内容も,「null非許容のプロパティ 'Name' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。プロパティを Null 許容として宣言することをご検討ください。」となっているはずである.

あるクラスにおいて,そのフィールド/プロパティを null にできるかどうか はクラスの意味付けや設計,用途から 慎重に判断 する必要がある問題である. ただし一般論として ほとんどのフィールドやプロパティは理由がない限りNull許容にするべきではない .C#におけるクラスという概念には「複数のデータを束ねたもの」という 側面があるが,ひとまとまりのデータのうち (から)にしてよいデータ項目 というのはその意味付けをよく考えなくてはならない. たとえば前述のStudentクラスのNameプロパティは,そのデータを空にしてよいだろうか?言い換えれば,Nameすなわち「名前」を持たない学生 といったものが発生しうるだろうか? 処理の都合上そのようなStudentクラスのインスタンスを扱う必要があるのであれば仕方がないが,このケースであればNameプロパティには null をセットにできるようにするべきではない, というのは自然に推察できるはずである.

Null許容型にするべきか否かという問題に関してはここで議論すると長くなるため話を元に戻すが,ともかくクラスのフィールドやプロパティはコンストラクターなどで何らかの値を指定しない限りデフォルト値で初期化されてしまうので, Null許容ではない普通の参照型のフィールドやプロパティには必ず null ではない何らかの値が入るようにしておかないと_のような警告が表示されてしまう. このため例えば先ほどのStudentのようなクラスであれば次のようにする必要がある.Program.csの末尾に記述したStudentクラスの定義に _に示す内容を追記しよう.

Studentクラスの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime Birthday { get; set; }

    public Student()          // Studentクラスのコンストラクター
    {                         //
        Name = "xyzzy";       // Name プロパティは Null 非許容なので
                              // null 以外の何かの値を入れておく必要がある.
    }                         // 
}

すると_に示す通り警告は表示されないはずである.

記述結果

ちなみに_は次のように書いても同じである.Program.csの末尾に記述したStudentクラスの定義を _に示す通りに変更してみよう.

Studentクラスの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Student
{
    public int ID { get; set; }
    
    public string Name { get; set; } = "xyzzy"; // 実はフィールド/プロパティの初期値は
                                                // このように指定することもできる.

    public DateTime Birthday { get; set; }

    // public Student()       //
    // {                      // ←コンストラクターは削除する
    //    Name = "xyzzy";     //
    // }                      //
}

これでも_に示す通り警告は表示されないはずである.

記述結果

本節のまとめとして,「クラスに,Null許容ではない普通の参照型のフィールド/プロパティを定義するときは, 必ずnullではない初期値が入るようにする必要がある」ということを覚えておこう.

ここまでを理解したら次に進もう.

Last updated on 2024-04-26
Published on 2024-04-26

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.