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();
}


포스트 영감:

좋은 웹페이지 즐겨찾기