여기에서 관찰되는 문제는보다 일반적인 문제의 특별한 경우입니다. 이는 적어도 일부 상황에서 유용 할 수있는 서로 다른 평등 정의의 수가 일반적으로 사용되는 표현 수단의 수를 초과한다는 것입니다. 이 문제는 평등을 테스트하는 다른 수단이 다른 결과를 산출하는 것이 혼란 스럽다는 불행한 믿음으로 인해 악화되는 경우가 있으며, 가능할 때마다 동일한 결과를 산출하는 다른 형태의 평등을 사용함으로써 그러한 혼란을 피할 수 있습니다.
실제로, 혼란의 근본적인 원인은 서로 다른 의미가 서로 다른 상황에서 유용하다는 사실에도 불구하고 서로 다른 형태의 평등 및 불평등 테스트가 동일한 결과를 산출 할 것으로 예상되어야한다는 잘못된 믿음입니다. 예를 들어, 산술적 관점에서 Decimal
후행 0의 수만 다른 것으로 비교할 수있는 것이 유용합니다 . double
양수 0 및 음수 0과 같은 값도 마찬가지입니다 . 반면 캐싱 또는 인턴 관점에서 이러한 의미는 치명적일 수 있습니다. 예를 들면, 일이 있었다 가정 Dictionary<Decimal, String>
되도록 myDict[someDecimal]
같아야를 someDecimal.ToString()
. 그러한 대상은 하나가 많은 경우 합리적으로 보일 것입니다Decimal
문자열로 변환하기를 원했고 많은 중복이있을 것으로 예상 한 값. 안타깝게도 이러한 캐싱을 사용하여 12.3m 및 12.40m를 변환 한 다음 12.30m 및 12.4m를 변환하면 후자의 값은 "12.30"및 "12.4"대신 "12.3"및 "12.40"을 생성합니다.
당면한 문제로 돌아가서, nullable 객체가 같은지 비교하는 현명한 방법이 하나 이상 있습니다. C #은 ==
연산자가 Equals
. VB.NET 은 그 동작을 원하는 사람은 누구나 .NET Framework를 Equals
사용할 수 있으므로 다른 언어의 동작을 반영해야한다는 관점을 취합니다 Equals
. 어떤 의미에서 올바른 해결책은 3 방향 "if"구조를 갖는 것이며, 조건식이 3 값 결과를 반환하는 경우 코드에서 null
케이스 에서 발생해야하는 작업을 지정해야합니다 . 그것은 언어의 옵션이 아니기 때문에 차선책은 단순히 다른 언어가 작동하는 방식을 배우고 동일하지 않다는 것을 인식하는 것입니다.
덧붙여서, C에없는 Visual Basic의 "Is"연산자는 nullable 개체가 실제로 null인지 여부를 테스트하는 데 사용할 수 있습니다. if
테스트가를 허용 해야하는지에 대해 합리적으로 질문 할 수 있지만 Boolean?
, nullable 유형에서 호출 될 때 Boolean?
대신 일반 비교 연산자가 반환되도록 하는 Boolean
것은 유용한 기능입니다. 덧붙여서, VB.NET에서 대신 같음 연산자를 사용하려고 시도 Is
하면 비교 결과가 항상이라는 경고가 표시되고 무언가가 null인지 테스트 Nothing
하려면 사용해야 Is
합니다.