C#8.0の「Nullablereferencetype」言語機能をすばやく理解する

Visual C#8.0では、コンパイラが提供する強力な関数を通じてNullable参照型(Nullable参照型)が導入され、開発者がnull参照によって引き起こされるコードの問題を可能な限り回避できるようになっています。ここでは、null許容参照型の基本的な内容を簡単に紹介します。
この言語機能に最初に触れたとき、理解するのは簡単ではないかもしれません。参照型は本質的にnull許容型ではありませんが、なぜ「null許容型参照型」の概念を特に導入する必要があるのでしょうか。実際、コンパイラの観点から、開発者は、null参照によって引き起こされるコードエラーを最小限に抑えるために、プログラミング時に変数がnullになる可能性があるかどうかを検討する必要があります
次のクラスがあるとします。

class Student
{
    public Student(string name, DateTime dayOfBirth)
        => (Name, DayOfBirth) = (name, dayOfBirth);

    public string Name { get; set; }

    public DateTime DayOfBirth { get; set; }

    public string Notes { get; set; }
}

このクラスは、「学生」エンティティの基本情報を定義します。簡単にするために、ここでは、説明する必要のあるいくつかの属性のみを示します。

  • 名前:学生の名前
  • DayOfBirth:学生の誕生日
  • 注:学生情報に関するいくつかのメモ

すべての学生の中から、コメントのあるすべての学生を検索し、すべての学生を名前で並べ替えるという2つの操作があるとします。C#でLinqを実装するのは簡単です。

var studentsHasNotes = students.Where(s => s.Notes.Length > 0);

と同様:

var orderedStudents = students.OrderBy(s => s.Name);

これまでのところ問題はなく、プログラムは正常に実行できます。ただし、注意深いコードレビューでは、コメントのあるすべての学生のコード(つまり、上記の最初のコード)で、null参照例外が発生する可能性があることを見つけるのは難しくありません。これは、「学生」エンティティの場合、それがメモであるためです。プロパティがnullの可能性があります。
ここで、「Nullable Reference Type」の言語機能を開きます。これを開くには、主に2つの方法があります。csprojプロジェクトファイルを編集してプロジェクトレベルで設定するか、#nullableプリコンパイル済みディレクティブを使用して次のことを実現します。

  • csprojプロジェクトファイルを編集して追加し<Nullable>enable</Nullable>ます。
    画像
  • これは、#nullableプリコンパイル済み命令によって実現されます。コードの必要な場所に#nullable命令を追加するだけです。
    画像

「null許容参照型」言語機能を有効にすると、上記のStudentクラスのコンストラクターに警告が表示され、コンストラクターを実行するときに、null許容値ではない「Notes」属性に空でない必要があることを示す警告が表示されます。 null値の場合、null許容文字列型に設定することをお勧めします。コンパイラが、Name属性ではなくNotesが空である可能性があることだけを要求するのはなぜですか?Nameはコンストラクターで割り当てられているため、StudentオブジェクトのNameを空にすることはできませんが、Notesは空ではありません。

画像

名前を空にすることはできませんか?文字列型ではないですか?コード内で空の場合はどうなりますか?心配しないでください。コンパイラはこの状況を許可しません。

画像

ここでは、Notesプロパティをstring?タイプに設定します。これにより、StudentオブジェクトにNotesデータを含めないため、コンストラクターの警告メッセージが表示されなくなりますが、「コメント情報を使用してすべての学生を検索する」操作すると、Notesが空である可能性があることを示す警告が再び表示されます。

画像

したがって、null許容参照型の言語機能を有効にした後、Student型の各参照型の属性を注意深く調べて、実際のアプリケーションで空にすることができるかどうか、また可能かどうかを確認する必要があることがわかります。空にするには、null許容参照型を使用して属性を定義します。そうすると、コンパイラはnull参照が存在する可能性のある場所を分析するのに役立ちます。

上記の「コメントですべての学生を見つける」の例で、Notesが確実に空にならない場合は、「!」演算子を使用して、次のようなコンパイラの警告メッセージを上書きすることもできます。

画像

現在、人気のある.NETオープンソースフレームワークは基本的にnull許容参照型をサポートしています。オープンソースフレームワークの開発者は、フレームワークでこの言語機能を有効にして、nullをできるだけ回避することを強くお勧めします。質問を引用します。たとえば、コードでnull許容参照型機能を有効にした場合、Newtonsoft.JsonのJsonConverterクラスから継承すると、null許容参照型の関数オーバーロードを使用する必要があることがわかります。

画像

ただし、null許容参照型機能を有効にしない場合、Newtonsoft.JsonのJsonConverterクラスから継承すると、オーバーロードされた関数のシグネチャが以前と同じであることがわかります。

画像

さて、C#8.0の「NullableReference Type」については、基本的にその要点と使用法を要約しているはずであり、日常の開発には十分なはずです。

おすすめ

転載: blog.csdn.net/nidongla/article/details/114933740