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.)