C≧8の非NULL参照型を持つ安全なコード


NULL参照例外は、中で遭遇する最も頻繁なエラーのうちの1つです.NETアプリケーション.フレームワークと同じくらい強力です、それは中心的な仮定のまわりに構築されますreference types nullを指すことができますので、参照型で動作するコードは、オブジェクトがnullでないか、明示的なチェックを行うかを知る必要があります.
NULLであるオブジェクトはしばしば非常にまれなシナリオでのみ発生するので、開発中やテスト中にこれらのタイプのエラーをキャッチしないようになります.これは.NET FrameworkとC Chorse言語は、バグがコードに深く隠れるようにする何かの周りに構築されます.
我々が必要とするものは、言語が彼らが起こる前にこれらの問題について我々に話すことです.
- Cnullable reference types feature これを修正することを目指しています.

非NULL参照型は何ですか?


まず、免責事項-私たちはいくつかの時間の許容可能な参照型を持っている.それが問題だ.新しい機能は、私たちが本当に働かなければならない非NULL参照タイプです、しかし、ドキュメンテーションはNullableな参照タイプとして新機能を参照するのを好みます.
null可能な参照型機能は、既存のすべての参照型を受け取り、エディターレベルで既定で非nullであると仮定します.リスキーコードはまだコンパイルされますが、nullとして初期化されたものに対して警告を得ることができます.

NULLはまだ重要な概念であるので、潜在的にNULL型を表現することができますが、参照型がデフォルトで非NULLであると仮定されるので、型はNULLであることを明示的に指定する必要があります.
これはいくぶん似ているhow TypeScript works , あなたがtypescriptの許容性に慣れているならば.

非NULL参照型の有効化


この機能を有効にするには、少なくともこの文書の時点で、手動で編集する必要があります.あなたがそれを可能にするすべてのプロジェクトのcsprojファイル.また、Visual Studio 2019またはを使用する必要があります.NETコア3.0以降.
具体的には、任意の2つの新しいプロパティを追加する必要がありますPropertyGroup : LangVersion and Nullable :
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AssemblyName>MattEland.SoftwareQualityTalk</AssemblyName>
    <RootNamespace>MattEland.SoftwareQualityTalk</RootNamespace>      

    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable> 

  </PropertyGroup>
LangVersionはC Count - CにC - Count - 8コンパイラを使うよう指示します.
nullableはすべての宣言された参照型がデフォルトで非NULLであると仮定します.

これは何を得るのですか?


Nullableな参照型を有効にすると、Visual Studioで多くの警告が表示されます.さまざまな値が潜在的にnullまたはnullを返す可能性があります.
具体的には、次のような警告がたくさん表示されます.

これは、上記のメソッドがResumeKeyword 戻り値の型.これは以前はデフォルトではNULLの参照型であり、特に指定されない限り、それは非NULLであると仮定されます.これを修正するには、戻り値の型をResumeKeyword?? インスタンスが存在しない可能性があることを示します.
正しいコードは次のように読みます.
private static ResumeKeyword? FindKeyword(IDictionary<string, ResumeKeyword> keywordBonuses, string key)
{
    if (keywordBonuses.ContainsKey(key)) 
    {
        return keywordBonuses[key];
    }

    return null;
}
あなたが多くの警告を見るつもりである他のものは、非NULLプロパティと初期化されていない変数です.これを修正するには、これらの良い初期値を割り当てるか、変数の値を変更することで、値を? オペレータは上記で使用しました.
非NULL参照型が生成されたコードを開発上の便宜的な方法で根本的に変更しないことを理解することは重要です.しかし、付加価値は、コードのシンプルさと混合巨大で、投資の価値がある.

参照可能な型への移行


あなたは、最初にnull許容リファレンスタイプをオンにするとき、あなたのコードで上記のような広範囲の警告を予想することができます.
あなたが少しずつ移行する必要があるならば、あなたは新しい#nullable disable 次の例のようなプリプロセッサディレクティブを示します.
#nullable disable
public class KeywordData
{
    public int Id { get; set; }
    public string Keyword { get; set; }
    public int Modifier { get; set; }
}
#nullable restore
また、(これはマイクロソフト推奨の方法です)、あなたが既にサポートして移行したクラスを除いて、プロジェクトのnull参照型を有効にすることはできませんでした.この場合は#nullable enable の代わりにdisable . これは、コードを通してコードビットを移行するのを助けます.そして、潜在的にあなたのコードを通して多くの多くの許容可能な指令を持っています.
このコードは次のようになります.
#nullable enable
public class KeywordData
{
    public int Id { get; set; }
    public string? Keyword { get; set; }
    public int Modifier { get; set; }
}
#nullable restore
参照Microsoft's upgrade guide Nullableな参照型で働くために既存のコードをアップグレードすることに関するより包括的な情報のために.

結論


私は強く、この機能を与える小規模な実験で試してみて、あなたが何を考えて見てお勧めします.あなたのコードの振る舞いについて明示的にすることを奨励することによって欠陥を取り除く可能性は大規模です.
コンパイラレベルでnullabilityを強制するより重い手のアプローチを必要とするならば、読んでください、しかし、構文がCのわずか8以上の非NULL参照型より面倒であることに注意してください.
パラメーターとプロパティのnull可能性を注釈する属性を使用するというアイデアが好きなら、チェックしてください.
全体的に私はCのくるみ8の非NULL参照型のシンプルさが好きです.あなたが彼らについてもっと学びたいならばofficial documentation .
あなたがより高品質のソフトウェアを構築する際にあなたのために良く働く何かを見つけるなら、私は常により良い方法を学ぶために探しているように私はそれについて聞いてみたい.