4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C#のnull許容型を処理する方法メモ

Posted at

はじめに

C#でNull許容型の変数をNull非許容に変換し、エラーや警告を回避する方法として認識しているもののメモを残したいと思います。
この記事内ではC#12.0を使用しています。

Nullableを処理する

isで変換する
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式で処理する
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合体演算子で別の値を入れる
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のプロパティ、メソッドにアクセスする

null条件演算子?.
void TestMethod(ClassA? nullableValue){
    //Nullableな変数のプロパティにアクセスする
    var nullableProperty = nullableValue?.Property; //nullableValue=nullの時はnullが入る
    
    //Nullableな変数のメソッドにアクセスする
    nullableValue?.Method(); //nullableValue = nullの時は実行されない
}

null条件演算子?.を使うとプロパティ、メソッドにアクセスするときのNull例外を防ぐことができます。
プロパティの場合は後ろにさらにnull合体演算子をつけてnullの場合の値を記述することもできます。
メソッドの方はnullの時は何もしないということが少ないのであまり使わない気がします。

おわりに

Null許容型はすごく便利ですが何もわからずに適当に使おうとすると今まで使えていたコードがエラーになって嫌いになってしまいやすい文法でもあります。しっかり使い方を学んでNull例外を駆逐していきましょう。

そんな書き方しねーよ、なんでこの記法書いてねーんだよ等ありましたらぜひ教えてください。

4
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?