C#8のnullにできない参照型は、実行時にnullにできますか?


10

nullでない変数がnullを持たないという保証は本当にないようです。nullにできないプロパティが1つあるクラスがあるとします。

public class Foo
{
    public Foo(string test)
    {
        Test = test;
    }
    public string Test {get;set;}
}

これはnullにできなくなったように見えるかもしれません。ただし、このクラスをnull許容コンテキストを使用しない別のライブラリで参照する場合、そこにnullを送信することを妨げるものはありません。

それは正しいですか、またはおそらくこれを確実にするいくつかの実行時チェックがありますか?


それはありますpublic void Foo(string test){...}public Foo(string test){...}
huMpty duMpty

ありがとう、修正しました。これは、人がコンストラクターを生成するためにR#に過度に依存している場合に起こります:)
Ilya Chernomordik

2
C#9は(おそらく)単純化されたnull検証を追加します
Steven

つまり、「null可能な参照型」機能は完全に壊れています。
アレハンドロ

回答:


9

これはMSが言っていることです(https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code):

コードがnullableアノテーションコンテキストを有効にしてコンパイルされている場合でも、コンパイラはパブリックAPIへのすべての呼び出しを検証できません。さらに、ライブラリは、null許容の参照型の使用をまだ選択していないプロジェクトによって消費される場合があります。nullを許容しない型として宣言した場合でも、パブリックAPIへの入力を検証します。


2

誰かがいつでもできる

var myFoo = new Foo(null);

ドメイン駆動設計を使用できるかもしれません

public class Foo
{
    public Foo(string test)
    {
         if (string.IsNullOrWhiteSpace(test))
             throw new ArgumentNullException(nameof(test));

         Test = test;
    }
    public string Test {get;private set;}
}

ええ、あなたは正しいです、それは私が推測しているとにかく単なる警告です。私は将来、たとえばKotlinのように本当にそれを強制できることを願っています
Ilya Chernomordik

2

あなたは正しいです。新機能を使用していない他のコードは、このプロパティにnullを割り当てる可能性があります。それは単なるコンパイラのヒントである実行時チェックはありません。

ランタイムチェックが必要な場合は、いつでも自分で行うことができます。

public string Test { get; set{ if (value == null) throw new ArgumentNullException() } }

ほとんどのコードでnullでないことを保証できることに注意してください。トップレベルのパブリックAPIにガードを追加し、クラスが適切にシールされていることを確認するだけです。

もちろん、人々はまだリフレクションを使用してコードをf ***できますが、その後、


つまり、これは事実上、null可能ではない型を使用していても、null参照例外を引き続き取得できることを意味します。
Ilya Chernomordik

ええと... コンパイルするコードには入れられません、ヒントはあります...しかし、ヒントを持たない他の人々のコードはコードを参照します-はい、彼らはnull例外を取得する可能性があります
ミルニー

まあ、たとえばオートマッパーがコンストラクターやそのようなものを使用している場合でも、例外が発生するのはまだあなたです:)
Ilya Chernomordik

Of course people can still use reflection to f*** your code up、真、真実。あなたは間違いなく、これを実行するためにリフレクションを使用することができ、それが推奨され人々はまだ、はい、それを行うのですか、。
Çöđěxěŕ

2

独自のコードでも、そうすることを選択した場合はnull、null許容演算子を使用してを渡すことができます。null!コンパイラのnull可能性分析に関する限り、nullではないと見なされます。


-1

nullチェックを処理し、コードを読みやすくするために、nullオブジェクトデザインパターンをお勧めします。

詳細はこちら:

https://www.c-sharpcorner.com/article/null-object-design-pattern/

基本的には、同じインターフェイスから派生し、インスタンスがnullの新しいオブジェクトを作成する必要があります。

例:

public class NullExample : IExample  
{  
    private static NullExample _instance;  
    private NullExample()  
    { }  

    public static NullExample Instance  
    {  
        get {  
            if (_instance == null)  
                return new NullExample();  
            return _instance;  
        }  
    }  

    //do nothing methods  
    public void MethodImplementedByInterface1()  
    { }  

    public void MethodImplementedByInterface1()  
    { }  
}  

ヌルは避けられませんが、きれいにチェックできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.