Skip to content

投稿

C# 8 - Null許容参照型

2019年11月4日 • 7分で読める

C# 8 - Null許容参照型

MicrosoftはC# 8にNull許容参照型という新機能を追加しています。最初は混乱するかもしれません。なぜなら、すべての参照型はnull許容だからです…では、これはどう違うのでしょうか?今後、この機能が有効になると、明示的にnull許容として記述しない限り、参照型は非null許容になります。

説明させてください。

Null許容参照型

Null許容参照型が有効になり、コンパイラが参照型がnullになる可能性があると判断すると、警告が表示されます。Visual Studioから警告メッセージが表示されます:

そしてビルド警告:

この警告を削除するには、参照型の後ろにクエスチョンマークを追加します。例えば:

public string StringTest()
{
    string? notNull = null;
    return notNull;
}

これで参照型はC# 8以前と同じように動作します。

この機能は、任意のC#ファイルの先頭に<span class="inline-code"> #nullable enable </span>を追加するか、.csprojファイルに<span class="inline-code">lt;NullableReferenceTypes&gt;true&lt;/NullableReferenceTypes&gt;</span>を追加することで有効になります。デフォルトでは有効になっていません。これは良いことです。もし有効になっていたら、既存のコードベースはクリスマスツリーのように警告で光ることになるでしょう。

Nullの議論

なぜMicrosoftは今この機能を追加するのでしょうか?Nullは言語の一部として、まあ最初からありました。正直なところ、理由はわかりません。私は常にnullを使ってきました。それはC#における事実でした。nullがないことが選択肢だとは思いませんでした…もしかしたら、nullなしの生活の方が良いかもしれません。それは今後わかることでしょう。

nullを使うべきか、使わないべきか?私が理解している限りの継続的な議論をまとめました。

賛成派

nullに賛成する議論は、一般的にオブジェクトが未知の状態を持つということです。この未知の状態はnullで表現されます。これはSQL Serverのbitデータ型で見ることができ、null(未設定)、0、1の3つの値を持ちます。また、UIでも見ることができ、ユーザーがフィールドに触れたかどうかを知ることが重要な場合があります。「nullの代わりに、なぜ未知の状態型や『未設定』状態を作らないのか?」と反論する人もいるかもしれません。これはnullとどう違うのでしょうか?この追加の状態もチェックする必要があります。今度は各インスタンスに対して未知の状態を作成することになります。なぜnullを使って、グローバルな未知の状態を持たないのでしょうか?

反対派

nullに反対する議論は、それが異なるデータ型であり、参照型を使用するたびにチェックしなければならないということです。結果として、このようなコードになります:

var user = GetUser(username, password);

if(user != null)
{
    DoSomethingWithUser(user);
} else 
{
    SetUserNotFoundErrorMessage()
}

GetUserメソッドが、ユーザーが見つからない場合も含めて、すべての場合でユーザーを返すとします。コードがnullを返すことがなければ、それに対する防御は無駄であり、理想的にはこれによってコードが簡素化されます。しかし、ある時点で空のユーザーをチェックし、エラーメッセージを表示する必要があります。nullを使わないことは、ユーザーが見つからないというビジネスケースを満たす必要性を取り除くものではありません。

この機能は良いアイデアでしょうか?

この機能の目的は、nullの使用を排除することではなく、代わりに「より良い方法はあるか?」という質問をすることです。そして時には答えは「いいえ」です。少しの先見性でnullの常時チェックを排除でき、それによってコードが簡素化されるなら、私は賛成です。良いニュースは、C#がnullの扱いを簡単にしてくれることです。

一部の人が教条的な立場を取り、システムに害をもたらしてまでnullの排除を主張することを恐れています。これは愚かな努力です。なぜなら、nullはC#に不可欠だからです。

Null許容参照型は良いアイデアでしょうか?最終的により簡単で、エラーが起こりにくいコードになるなら、それは良いアイデアです。

著者:Chuck Conwayはソフトウェアエンジニアリングと生成AIを専門としています。ソーシャルメディアで彼とつながりましょう:X (@chuckconway) または YouTube をご覧ください。

↑ トップに戻る

こちらもおすすめ