294 Views
August 09, 24
スライド概要
プログラミングにおいて、Null参照は大きな課題の1つです。Null Safetyは、Nullに関連する問題を解決するための重要な概念になります。
ベガシステム技術勉強会の発表資料です。
ベガシステムは、創業1990年、30年以上続くIT企業です。 お客様との対話を大切にし、新たな価値を創造し続けます。
https://www.vega-net.co.jp/ Null Safety 2023年10月25日(水)
アジェンダ 1. Nullとは? 2. Null Safetyとは? 3. 試してみた 4. まとめ © 2023 VEGA Systems Inc. 2
1. NULLとは? NULLとは プログラムの世界では、 「何もない 」ということを表します。 “0”ではなく、”何もない” 1 © 2023 VEGA Systems Inc. 0 NULL 3
1. NULLとは? よく見るやつ、NULL参照 例) Java Java.lang.NullPointerException →値がnullの変数を参照した時に発生する例外 © 2023 VEGA Systems Inc. 4
1. NULLとは? よく見るやつ、NULL参照 という言葉が飛び出すほど、影響を及ぼしてきた 引用: https://genesis-tech.jp/blog/null-safety-of-csharp/ © 2023 VEGA Systems Inc. 5
1. NULLとは? NULLへの対策 変数・personがnullで返却されてきた場合、 personのNameにアクセスしようとすると、 いわゆる「null参照」で落ちることになる。 回避するにはnull判定のコードを 書く必要がある。 上記のように、様々な場面でnullを想定して回避する実装をすれば対処できるが、 見落としなどにより、nullチェックができていない実装や、 nullが来ることを期待していないのに、nullが来てしまう実装が存在すると、 null参照で落ちる危険性がある。 引用: https://genesis-tech.jp/blog/null-safety-of-csharp/ © 2023 VEGA Systems Inc. 6
このNULLにつきまとう問題を解決するため、 先人たちの努力により、新たな仕組みが作られました。 © 2023 VEGA Systems Inc. 7
2. Null Safety とは? Null Safety とは ※C#を例に NULLが原因で発生するエラーをコンパイル時に防止する仕組み NULL安全 とも呼ばれる →NULLを扱える変数、扱えない変数を区別して コンパイル時からNULLが原因で発生するエラーを防止する 変数B 変数A Null Safety © 2023 VEGA Systems Inc. 8
2. Null Safety とは? 参考「null許容値型」と「null参照許容型」 もともと、C#では値型(intやstructなど)はnull値が取れず、 値型の変数でnull値を代入するには、「null許容値型」を使う必要があった。 (int? のように ? を付けて宣言) 一方、参照型(stringやobjectなど)は、デフォルトでnullが許容されているので、 許容・非許容が区別されていなかった。 「null参照許容型」の登場により、 C#でも参照型の「null許容 / null非許容」の 区別が付くようになったので、 null参照例外が発生するコードは、 コンパイル時に検出してくれるようになり「null安全」が満たされるようになった。 引用: https://genesis-tech.jp/blog/null-safety-of-csharp/ © 2023 VEGA Systems Inc. 9
2. Null Safety とは? よいところ ・想定外の箇所で変数がnullになり、不具合になってしまうことを防げる。 ・nullの可能性を想定して、nullを判定するコードを書く必要がなくなる。 (nullが必要な箇所は区別して、nullを判定するコードを書く。) Null Safery:ない コードを書く 沢山null判定のコードを 書いたのにここで例外が 出るのは想定してないよ~ コンパイル NULL例外が発生する コードのチェックなし 想定外のNULL例外が 発生する可能性あり nullが必要な箇所だけnull判定の コードを書けばいいね 見落としていてもコンパイル 時に教えてくれるから安心 Null Safety:あり コードを書く © 2023 VEGA Systems Inc. コンパイル NULL例外が発生する コードをチェック コンパイルが通ればNULL 例外は発生し得ない 10
3. 試してみた NULL SAFETY の使い方 →「null参照許容型」 を有効にする ※C# 8.0から導入 有効にすると、参照型のTに対して、nullを認めなくなる(null非許容 → non-null) このため、nullを設定できない型にnullを設定しているコードは、 コンパイル時に検出されるようになった。 修正しなきゃ nullはNGです! コンパイル時に検出される 参考:https://ufcpp.net/study/csharp/resource/nullablereferencetype/ © 2023 VEGA Systems Inc. non-null 11
3. 試してみた NULL SAFETY の使い方 仕様や運用上で、nullを扱う場合には、 T? の形で記述することで、nullを許容することができる(null許容 → nullable) ※nullを許容してしまうので、従来通りnullチェックの構文は書く必要がある。 nullでもOKです コンパイルエラーにならない nullable © 2023 VEGA Systems Inc. 12
3. 試してみた ■:警告 ■:エラー ■:OK ディレクティブ外で “?” を定義すると警告が出る ディレクティブ コンパイル © 2023 VEGA Systems Inc. 13
3. 試してみた 下記の条件演算子や、合体演算子を組み合わせて使う 参考: https://atmarkit.itmedia.co.jp/ait/articles/1607/07/news023.html © 2023 VEGA Systems Inc. 14
4. まとめ まとめ ・NULLとは、”0”ではなく”何もない” ・NULLは昔から影響を及ぼしてきた ★Null Safetyは、NULLが原因で発生するエラーをコンパイル時に防止する仕組み ・NULLを扱える変数、扱えない変数を区別してプログラムの安全性を高める。 (null許容型とnull非許容型) ・想定外の箇所で変数がnullになり、不具合になってしまうことを防げる。 ・nullの可能性を想定して、nullを判定するコードを書く必要がなくなる。 (nullが必要な箇所は区別して、nullを判定するコードを書くだけでよい。) →NULLになり得る状況を見逃さないようにして、そのための記述もシンプルに書きやすく! 覚えてね~ © 2023 VEGA Systems Inc. 15