情報応用演習Ⅰ(2024)

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

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

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

2b-3. Null許容参照型

まずはNull許容型の考え方の変化を端的に実感することができるコードを紹介しよう.Program.csを_に示すように変更しよう.

Program.csの変更内容
1
2
3
string hoge = null;

Console.WriteLine(hoge);

単に string 型の変数hogeを宣言して,Console.WriteLine()メソッドで表示を行っているだけである. しかし,このプログラムを記述すると,変数hogeの初期値の部分に_に示すような警告が表示されるはずである.

記述結果

従来のC#では_で使用しているような,string 型をはじめとしたクラス型や配列型といった参照型の変数には null を代入することができた. 現在のC#では,参照型であっても null を代入する必要がある場合は変数の型をNull許容型にしなければならなくなった. つまり型名に?をつける必要がある,ということである.

したがって,__のように書くのが正しい方法となった. Program.csを_に示す通りに書き替えよう.

Program.csの変更内容
1
2
3
string? hoge = null; // string型のNull許容型

Console.WriteLine(hoge);

このような型をNull許容参照型という. 従来のNull許容型は基本的に値型から作成するものであったが,新しいC#では値型であろうと参照型であろうと null を代入する必要があるのであれば 型名に?を付けなければならなくなった.これはメソッド内のローカル変数や,クラスのフィールド/プロパティであっても同じである.

注意するべきは,値型のNull参照型と異なり,Null許容参照型には .HasValueプロパティ.Valueプロパティがない,という点である. ためしにProgram.csに_に示す内容を追記してみよう.

Program.csの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
string? hoge = null; // 参照型のNull許容の変数

Console.WriteLine(hoge);

int? piyo = null; // 値型のNull許容型の変数

if (piyo.HasValue)                   // 値型のNull許容型ならば .HasValue や
{                                    //
    Console.WriteLine(piyo.Value);   // .Value といったプロパティを使うことができる.
}                                    // 

if (hoge.HasValue)                   // いっぽう,参照型のNull許容型の場合,
{                                    // .HasValue や .Value といった
    Console.WriteLine(hoge.Value);   // プロパティはない.
}                                    //

5行目では従来と同じ 値型の Null許容型,ここでは int 型のNull許容型の変数piyoを宣言している. そして7~10行目ではこの変数piyoに対して,その変数に null が入っているかどうかを確認するために.HasValueプロパティを, また変数に入っている値を取り出すために.Valueプロパティを使用している.値型のNull許容型に関しては操作方法は従来と同じである.

しかし,12~15行目で最初に宣言したNull許容参照型の変数hogeに対して同じ操作をしようとしている部分はエラーとなって, Visual Studio のエディタ上では赤い波線が現れているはずである(_).

記述結果

参照型の変数の中身が null であるかどうかのチェックや,その変数の中身にアクセスする方法に関してはNull許容参照型であっても従来と同じである. したがって_のようにするのが正しい.Program.csを_に示す通りに書き替えよう.

Program.csの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
string? hoge = null;

Console.WriteLine(hoge);

int? piyo = null;

if (piyo.HasValue)
{
    Console.WriteLine(piyo.Value);
}

if (hoge != null)
{
    Console.WriteLine(hoge);
}

ちなみにif (hoge != null)の部分はif ( hoge is not null )のように書くこともできる (参考).

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

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