プロジェクトでnull可能な参照タイプを有効にする

Intro#
C#は、8.0以降、null可能な参照タイプを導入しました。プロジェクトのnull可能な参照タイプを有効にして、コンパイラを使用して、コード内のnull参照の処理をより適切に処理できるようにします。これにより、不要なnullチェックを大量に作成する必要がなくなります。効率を上げるために

なぜ
#null可能な参照タイプを有効にする必要があるのですか?まず、asp.netコアプロジェクトを確認できます。Asp.netコアプロジェクトは、null可能な参照タイプを多数使用しています。詳細については、
https //github.com/を参照してください。 dotnet / aspnetcore / issues / 5680

C#8のnull許容参照型を使用するようにASP.NET Coreを更新すると、次のようになります。

ASP.NET Coreライブラリが内部でnull参照の例外を回避できるようにします。これにより、バグを見つけて防止し、開発者の生産性を向上させる
ことができます。ASP.NETCoreを使用している開発者に、null参照を受け入れて返すことができるAPIとAPIについてのガイダンスを提供します。できません。これにより、ASP.NET Coreを使用する開発者のエクスペリエンスが向上します
。1つは内部コードです。1つは内部コードです。内部コードの場合、null可能な参照型を使用して、コンパイラを使用して変数を明確に理解できます。 nullになるかどうかに関係なく、nullにならない変数はnullチェックを必要としなくなります。一方、使用されるコードの場合、コンパイラは、null参照型を有効にするクラスライブラリの使用に対して、より優れたnullチェックサポートを提供できます。開発者は、どのAPIをnullに許可し、どのAPIをnullに許可しないかを明確に理解できます。これは、開発者にとってより使いやすいものです。

方法#
次に、プロジェクトでnull可能な参照タイプを有効にする方法を見てみましょう。Microsoftのドキュメントに詳細な手順が記載されています。詳細については、記事の最後にある参照リンクを参照してください。

null可能な参照タイプを有効にするには、プロジェクトファイルにenableを追加するだけでよく、LangVersionを8以上に設定する必要があります。

ヌル可能コンテキストには2つのコンテキストが含まれます。1つはヌル可能アノテーションコンテキスト(ヌル可能参照タイプの?をサポート)、もう1つはヌル可能警告コンテキスト(ヌル可能参照タイプのコンパイラ警告をサポート)です。

ヌル可能コンテキストには4つの構成があり、構成は次のとおりです。

有効な
警告
注釈
無効
設定警告コンテキストステータス注釈コンテキストステータス
有効有効有効
警告有効無効
注釈無効有効
無効無効無効有効
を直接使用して無効化可能な参照タイプを有効にし、注釈コンテキストのみを有効にすることをお勧めします。コンパイラは無効化可能な参照タイプをチェックしません。警告はそれほど重要ではありません。警告コンテキストのみを有効にしてください。独自のアプリケーションでnull可能参照タイプを有効にしたくない場合は、この構成を使用できます。nullableを構成しないか、disableを構成しない場合は、null可能参照タイプを完全に無効にできます。

プロジェクトのグローバル構成に加えて、プロジェクトソースコードの#nullableを使用してローカルのnullableコンテキスト構成を変更し、#nullablerestoreを使用してデフォルトのnullable参照コンテキスト構成を復元することもできます。

#nullable enable: 设置 nullable annotation context 和 nullable warning context 为 enabled.
#nullable disable: 设置 nullable annotation context 和 nullable warning context 为 disabled.
#nullable restore: 恢复 nullable annotation context 和 nullable warning context 为项目默认的配置.
#nullable disable warnings: 设置 nullable warning context 为 disabled.
#nullable enable warnings: 设置 nullable warning context 为 enabled.
#nullable restore warnings: 恢复 nullable warning context 为项目配置
#nullable disable annotations: 设置 nullable annotation context 为 disabled.
#nullable enable annotations: 设置 nullable annotation context 为 enabled.
#nullable restore annotations: 恢复 annotation warning context 为项目配置

null可能な参照タイプを有効にした後、参照タイプをnullに設定することはできません。nullに設定する場合は、タイプの後に?を追加して、string?などのnull可能な参照タイプに設定するか、!を使用してコンパイラに値を割り当てさせます。例:string a = null!;(これも注意が必要な場所です。null可能な参照タイプはコンパイラによってのみチェックされ、nullに割り当てられないことを厳密に保証することはできません。クラスライブラリプロジェクトの場合、パブリックAPIの場合期待されるパラメータは、null不可能な参照タイプです。null不可能な参照タイプを使用することに加えて、nullチェックを維持する必要があります)

Sample#
は、最初にインターフェイスを確認できます。

public interface IPropertyConfiguration<out TEntity, TProperty>
{
    
    
    IPropertyConfiguration<TEntity, TProperty> HasColumnTitle(string title);

    IPropertyConfiguration<TEntity, TProperty> HasColumnFormatter(string? formatter);

    IPropertyConfiguration<TEntity, TProperty> HasColumnInputFormatter(Func<string?, TProperty?>? formatterFunc);
}

実装を見てください:

internal sealed class PropertyConfiguration<TEntity, TProperty> : PropertyConfiguration, IPropertyConfiguration<TEntity, TProperty>
{
    
    
    private readonly PropertyInfo _propertyInfo;

    public PropertyConfiguration(PropertyInfo propertyInfo)
    {
    
    
        _propertyInfo = propertyInfo;
        PropertyName = propertyInfo.Name;
        ColumnTitle = propertyInfo.Name;
    }

    public IPropertyConfiguration<TEntity, TProperty> HasColumnTitle(string title)
    {
    
    
        ColumnTitle = title ?? throw new ArgumentNullException(nameof(title));
        return this;
    }

    public IPropertyConfiguration<TEntity, TProperty> HasColumnFormatter(string? formatter)
    {
    
    
        ColumnFormatter = formatter;
        return this;
    }

    public IPropertyConfiguration<TEntity, TProperty> HasInputFormatter(
        Func<TEntity?, TProperty?, TProperty?>? formatterFunc)
    {
    
    
        InternalCache.InputFormatterFuncCache.AddOrUpdate(_propertyInfo, formatterFunc);
        return this;
    }
}

HasColumnTitleのパラメータのタイトルがnull不可能な参照タイプであることがわかります。それでも、実装コードはnullであるかどうかがチェックされ、null可能な参照タイプは新しいArgumentNullException()をスローしても警告を表示しません。

警告の例:

null不可能な参照タイプにnullを割り当てると、コンパイラーは警告を出します。例は次のとおりです。

ここに写真の説明を挿入

add pythonベースのチュートリアルの残業nullのリストのタイプへのnull以外の参照では、コンパイラーは警告を出します。

ここに写真の説明を挿入

null可能な参照タイプ変数がnullについてチェックされていない場合、警告が表示されます。
ここに写真の説明を挿入

上の図からわかるように、varを使用して変数を宣言すると、null可能な参照タイプになります。

詳細
#null可能な参照タイプを使用すると、c#チュートリアルである程度、不要なnullチェック減らすことができますが、クラスライブラリプロジェクトの場合は、いくつかのnullチェックが必要です。

アプリケーションの場合、null可能な参照タイプを使用すると、nullをチェックする必要がある場所と不要な場所を明確に理解できるため、コードの品質が向上します。

null包含演算子!の場合、null可能オブジェクトをnull不可能な参照タイプ変数に割り当て、使用しないようにすることができます。これを使用して、コードに私のものを埋めます。nullではない変数と属性も表示されます。 nullの場合、必要なnullチェックがまだない場合は、完全に自分で調べています。

しかし、使用の過程で、それでも十分にスマートではなく、テストプロジェクトでアサートするときにうまく機能しない場合があると感じています。例を見てみましょう。
ここに写真の説明を挿入

上記の例から、importedList [i] .Id / Titleの前にAssert.NotNull(importedList [i])が使用されています。理論的には、importedList [i]はnullにはなりませんが、コンパイラは引き続き使用されます。それほど賢くないので、vb.netチュートリアルに進んで、
1つのステップを最適化する必要があります。この状況では、変数を個別に宣言して、!を使用できます。null不可能な参照タイプを宣言するには。テストプロジェクトで警告を無効にする場合は、nullableを設定することもできます。レベルは注釈であるか無効になっています

最後に、現在のasp.netコアがnull可能な参照タイプを積極的に採用していることを考えると、まだ理解できると言いたいです。

Reference#
https
//docs.microsoft.com/en-us/dotnet/csharp/nullable-references https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references
https://docs.microsoft.com/en-us/dotnet/csharp/nullable-migration-strategies
https://github.com/dotnet/aspnetcore/issues/5680https://github.com/WeihanLi/WeihanLi
。 Npoi / pull / 98
https://github.com/WeihanLi/DbTool
https://github.com/dotnet/samples/tree/master/csharp/NullableIntroduction/NullableIntroduction
https://stackoverflow.com/questions/54526652/when -to-null-check-arguments-with-nullable-reference-types-enabled
https://headspring.com/2020/06/02/applying-nullable-reference-types-in-fixie/
作者:WeihanLi

出典:https://www.cnblogs.com/weihanli/p/14290642.html

おすすめ

転載: blog.csdn.net/chinaherolts2008/article/details/112813242