はじめに
C#でNull許容型の変数をNull非許容に変換し、エラーや警告を回避する方法として認識しているもののメモを残したいと思います。
この記事内ではC#12.0を使用しています。
Nullableを処理する
isで変換する
void TestMethod(ClassA? nullableValue){
if(nullableValue is ClassA value){
//valueにnullableValueの値が入る
value.MethodA();
}
else{
//nullableValue = nullの時の処理
throw new Exception("nullableValue is null");
}
}
変数(null許容) is 型(null非許容)とするとで値が入っている場合trueを返せます。後ろに変数名を付けると値が代入された状態のnull非許容の変数を宣言することができます。
switch式で処理する
void TestMethod(Int? number){
var text = number switch
{
1 => "one", //case 1
2 => "two", //case 2
null => throw new Exception("is null") , //nullの場合も普通の値と同様に書ける
_ => throw new Exception("out of range") //default
};
}
switch式(パターンマッチング)でnullのパターンを記述できるのでnullの時にnullを返さないようにすればnull非許容に変換できます。
null合体演算子で別の値を入れる
void TestMethod(string? nullableText){
string textValue = nullableText ?? "";//nullの場合右辺を代入する
nullableText ??= "";//=をつけて同じ変数に代入することもできる
}
null合体演算子??を使うとnullの場合は別の値を代入することができます。
??=は変数の型が変わらないので個人的にあまり好みではありませんが…
ロジックで除く
private void TestMethod(ClassA? nullableValue){
nullableValue.MethodA(); //こちらは警告,エラーが発生する
if(nullableValue is null)throw new Exception("nallableValue is null");
nullableValue.MethodA(); //こちらは警告,エラーは発生しない
}
ロジックでnullをである可能性を排除すればnull許容型のプロパティにアクセスしてもエラーが発生しません。
多分コンパイラがうまく読み取ってくれているんだと思います便利ですね。個人的には同じ書き方でも文脈で状態が変わるのが気持ち悪くてあまり使いません。
Nullableのプロパティ、メソッドにアクセスする
void TestMethod(ClassA? nullableValue){
//Nullableな変数のプロパティにアクセスする
var nullableProperty = nullableValue?.Property; //nullableValue=nullの時はnullが入る
//Nullableな変数のメソッドにアクセスする
nullableValue?.Method(); //nullableValue = nullの時は実行されない
}
null条件演算子?.を使うとプロパティ、メソッドにアクセスするときのNull例外を防ぐことができます。
プロパティの場合は後ろにさらにnull合体演算子をつけてnullの場合の値を記述することもできます。
メソッドの方はnullの時は何もしないということが少ないのであまり使わない気がします。
おわりに
Null許容型はすごく便利ですが何もわからずに適当に使おうとすると今まで使えていたコードがエラーになって嫌いになってしまいやすい文法でもあります。しっかり使い方を学んでNull例外を駆逐していきましょう。
そんな書き方しねーよ、なんでこの記法書いてねーんだよ等ありましたらぜひ教えてください。