C # 8의 널 입력 불가능 참조 유형이 런타임에서 널이 될 수 있습니까?


10

nullable이 아닌 변수에 null이 없다는 보장은 실제로 없습니다. nullable이 아닌 하나의 속성이있는 클래스가 있다고 상상해보십시오.

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

이제는 null이 될 수없는 것처럼 보일 수 있습니다. 그러나이 클래스를 nullable 컨텍스트를 사용하지 않는 다른 라이브러리로 참조하면 아무것도 null을 보내지 않습니다.

이것이 맞습니까? 아니면 이것을 확인하는 런타임 검사가 있습니까?


그것은인가 public void Foo(string test){...}또는 public Foo(string test){...}?
huMpty duMpty

고마워, 내가 고쳤다. 즉 사람이 :) 생성자를 생성하기 위해 R 번호에 너무 많이 의존 할 때 발생하는 상황
일리아 Chernomordik에게


즉, "널링 가능 참조 유형"기능이 완전히 손상되었습니다.
Alejandro

답변:


9

이것은 MS가 말한 것입니다 ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code ) :

코드가 nullable 주석 컨텍스트를 활성화하여 컴파일 된 경우에도 컴파일러는 퍼블릭 API에 대한 모든 호출의 유효성을 검사 할 수 없습니다. 또한 아직 널 입력 가능 참조 유형을 사용하지 않는 프로젝트에서 라이브러리를 사용할 수 있습니다. 널 입력 불가능 유형으로 선언 한 경우에도 공용 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;}
}

그래, 당신 말이 맞아, 어쨌든 내가 생각하는 경고 일뿐입니다. 나는 그들이 정말 예를 들어 코 틀린처럼 어떻게든지 적용 할 수 있습니다 미래에 희망을
일리아 Chernomordik

2

맞습니다. 새 기능을 사용하지 않는 다른 코드는이 속성에 null을 할당 할 수 있습니다. 런타임 검사는 더 간단한 힌트 일뿐입니다.

런타임 검사를 원한다면 언제든지 직접 할 수 있습니다.

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

대부분 의 코드 에서 null이되지 않도록 보장 할 수 있으므로 최상위 공용 API에 가드를 추가하고 클래스가 적절하게 봉인되어 있는지 확인하면됩니다.

물론 사람들은 여전히 ​​리플렉션을 사용하여 코드를 강화 할 수는 있지만 그 코드에 반영 할 수 있습니다


따라서 이것은 nullable이 아닌 유형을 사용하더라도 여전히 Null 참조 예외를 얻을 수 있음을 의미합니다.
Ilya Chernomordik '12

글쎄 .... 당신 은 당신이 컴파일 한 코드 사용할 수 없으며, 힌트를 가지고 있기 때문에 ... 힌트가없는 다른 사람들의 코드는 참조하지만 코드를 참조하십시오-예, 그들은 null 예외를 얻을 수 있습니다
Milney

예를 들어, automapper가 생성자를 사용하거나 이와 유사한 것을 사용하는 경우 여전히 예외가 발생합니다.)
Ilya Chernomordik

Of course people can still use reflection to f*** your code up, 사실, 사실입니다. 반사를 사용 하여이 작업을 수행 할 수 있습니다. 추천입니까 , 아니오 , 사람들이 여전히 그렇게하십시오.
Çöđěxěŕ

2

자신의 코드에서도, 당신이 그렇게하기로 선택한다면 null, 널 용서 연산자를 사용하여를 전달할 수 있습니다 . null!컴파일러의 Nullability 분석에 관한 한 Null이 아닌 것으로 간주됩니다.


-1

null 검사를 처리하고 코드를 읽을 수있게하려면 Null Object Design 패턴을 제안합니다.

더 읽을 거리 :

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.