Skip to content

投稿

C# 8 - Nullable Reference Types

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

C# 8 - Nullable Reference Types

Microsoftは、C# 8にNullable Reference Typesという新機能を追加しています。最初は混乱しやすいのですが、すべての参照型はnullableなので、どう違うのでしょうか?今後、この機能が有効になると、参照型はnon-nullableになります。ただし、明示的にnullableとして記述しない限りです。

説明させてください。

Nullable Reference Types

Nullable Reference Typesが有効になっていて、コンパイラが参照型が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 データ型で見られます。これは3つの値を持ちます。null(未設定)、0、1です。また、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を排除することを主張する人もいるのではないかと懸念しています。これは愚かな試みです。なぜなら、nullはC#に不可欠だからです。

Nullable Reference Typesは良いアイデアですか?最終的な結果がより単純でエラーが少ないコードであれば、そうです。

Author: Chuck Conway is an AI Engineer with nearly 30 years of software engineering experience. He builds practical AI systems—content pipelines, infrastructure agents, and tools that solve real problems—and shares what he’s learning along the way. Connect with him on social media: X (@chuckconway) or visit him on YouTube and on SubStack.

著者: Chuck Conwayは、ソフトウェアエンジニアリングの経験が30年近くあるAIエンジニアです。彼は実用的なAIシステム(コンテンツパイプライン、インフラストラクチャエージェント、実際の問題を解決するツール)を構築し、学んだことを共有しています。ソーシャルメディアで彼とつながってください: X (@chuckconway) または YouTubeSubStack で彼を訪問してください。

↑ トップに戻る

こちらもおすすめ