C# : null 허용 여부를 확인하려면 == && !=를 피하세요.
                                            
                                                
                                                
                                                
                                                
                                                
                                                 9139 단어  csharpprogramming
                    
NullReferenceException.var car = new Car();
if(car != null) 
{ 
    // invoke method on car variable 
}
모든 프로그래머는 피해야 할 올바른 접근 방식이라는 것을 알고 있습니다
NullReferenceException.하지만 그렇습니까?
흥미롭게도 == 또는 != 사용에 대해 생각하면 이러한 연산자를 사용하는 것이 변수가 null인지 여부를 확인하는 적절한 방법이 아니라는 것이 매우 빨리 명백해집니다. 왜냐하면 C#에는 operator overloading 가 있기 때문입니다. 다음 예를 참조하십시오.
 public class Car
{
    public static bool operator ==(Car lhs, Car rhs) => true;
    public static bool operator !=(Car lhs, Car rhs) => !(lhs == rhs);
}
이 구현의 경우 아래와 같이 null 검사에 대해 부적절한 결과가 나타납니다.
 [Fact]
public void CSharp_Runtime_Should_Return_True_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
   (car == null).ShouldBeTrue();
}
[Fact]
public void CSharp_Runtime_Should_Return_False_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
   (car != null).ShouldBeFalse();
}
 그렇다면 해결책은 무엇입니까?
아래와 같이 is & is not 연산자 조합을 사용하십시오.
 [Fact]
public void CSharp_Runtime_Should_Return_False_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
    (car is null).ShouldBeFalse();
}
[Fact]
public void CSharp_Runtime_Should_Return_True_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
    (car is not null).ShouldBeTrue();
}
is { } 식을 아래와 같이 사용합니다.
 [Fact]
public void CSharp_Runtime_Should_Return_True_That_Variable_Is_Not_Null_Using_Property_Pattern_Matching()
{
    var car = new Car();
    (car is { }).ShouldBeTrue();
}
[Fact]
public void CSharp_Runtime_Should_Return_False_That_Variable_Is_Null_Using_Property_Pattern_Matching()
{
    Car car = null;
    (car is { }).ShouldBeFalse();
}
참고: is { } 표현식은 변수가 object의 인스턴스인지 확인합니다.
다음과 같이 object.ReferenceEquals static 방법을 사용하십시오.
 [Fact]
public void CSharp_Runtime_Should_Return_True_Provided_That_Variable_Is_Not_Null_Using_Reference_Equality_Check()
{
    var car = new Car();
    car.IsNotNull().ShouldBeTrue();
}
[Fact]
public void CSharp_Runtime_Should_Return_False_Provided_That_Variable_Is_Null_Using_Reference_Equality_Check()
{
    Car car = null;
    car.IsNotNull().ShouldBeFalse();
}
...
...
...
public static class ObjectExtensions
{
    public static bool IsNull<T>(this T obj) => ReferenceEquals(obj, null);
    public static bool IsNotNull<T>(this T obj) => !obj.IsNull();
}
포스트 영감:
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(C# : null 허용 여부를 확인하려면 == && !=를 피하세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://dev.to/pollobatgit/c-avoid-to-check-for-nullability-4lnd
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
public class Car
{
    public static bool operator ==(Car lhs, Car rhs) => true;
    public static bool operator !=(Car lhs, Car rhs) => !(lhs == rhs);
}
[Fact]
public void CSharp_Runtime_Should_Return_True_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
   (car == null).ShouldBeTrue();
}
[Fact]
public void CSharp_Runtime_Should_Return_False_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
   (car != null).ShouldBeFalse();
}
아래와 같이
is & is not 연산자 조합을 사용하십시오.[Fact]
public void CSharp_Runtime_Should_Return_False_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
    (car is null).ShouldBeFalse();
}
[Fact]
public void CSharp_Runtime_Should_Return_True_Provided_That_Variable_Is_Not_Null()
{
    var car = new Car();
    (car is not null).ShouldBeTrue();
}
is { } 식을 아래와 같이 사용합니다.[Fact]
public void CSharp_Runtime_Should_Return_True_That_Variable_Is_Not_Null_Using_Property_Pattern_Matching()
{
    var car = new Car();
    (car is { }).ShouldBeTrue();
}
[Fact]
public void CSharp_Runtime_Should_Return_False_That_Variable_Is_Null_Using_Property_Pattern_Matching()
{
    Car car = null;
    (car is { }).ShouldBeFalse();
}
참고:
is { } 표현식은 변수가 object의 인스턴스인지 확인합니다.다음과 같이
object.ReferenceEquals static 방법을 사용하십시오.[Fact]
public void CSharp_Runtime_Should_Return_True_Provided_That_Variable_Is_Not_Null_Using_Reference_Equality_Check()
{
    var car = new Car();
    car.IsNotNull().ShouldBeTrue();
}
[Fact]
public void CSharp_Runtime_Should_Return_False_Provided_That_Variable_Is_Null_Using_Reference_Equality_Check()
{
    Car car = null;
    car.IsNotNull().ShouldBeFalse();
}
...
...
...
public static class ObjectExtensions
{
    public static bool IsNull<T>(this T obj) => ReferenceEquals(obj, null);
    public static bool IsNotNull<T>(this T obj) => !obj.IsNull();
}
포스트 영감:
Reference
이 문제에 관하여(C# : null 허용 여부를 확인하려면 == && !=를 피하세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pollobatgit/c-avoid-to-check-for-nullability-4lnd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)