【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
クラスの定義に
_に示す内容を追記しよう.
|
|
すると_に示す通り警告は表示されないはずである.
ちなみに_は次のように書いても同じである.Program.csの末尾に記述したStudent
クラスの定義を
_に示す通りに変更してみよう.
|
|
これでも_に示す通り警告は表示されないはずである.
本節のまとめとして,「クラスに,Null許容ではない普通の参照型のフィールド/プロパティを定義するときは,
必ずnull
ではない初期値が入るようにする必要がある」ということを覚えておこう.
ここまでを理解したら次に進もう.