"ReferenceEquals(myObject, null)"이 "myObject == null"보다 더 나은 방법입니까?
다음과 같이 무효 수표를 쓰는 것을 좋아하는 동료가 있습니다.
if (!ReferenceEquals(myObject, null))
반면에 저는 이 구문을 읽기가 번거롭고 선호합니다.
if (myObject != null)
연산자 오버로드와 관련하여 ReferenceEquals의 장점을 논의하는 몇 가지 기사와 스택 오버플로 질문을 찾았지만, 연산자 오버로드 시나리오 외에 ReferenceEquals 대 ==의 이점이 있습니까?
그러나 연산자 오버로드 시나리오 외에 ReferenceEquals와 ==의 이점이 있습니까?
아니요 - 명시적으로 사용할 수 있는 유일한 장점(그리고 별로 장점이 되지 않는다고 주장합니다)은 아니라고 주장합니다.Object.ReferenceEquals
오버로드된 연산자 등호를 절대 사용하지 않습니다.계산되지 않은 경우, == 연산자는 모든 "문자열 이외의 참조 유형"에 대해 "두 피연산자가 동일한 객체를 참조하는 경우 true로 정의됩니다.이와 같이 동등합니다(과부하가 발생하지 않는 한).
저는 개인적으로 두 번째 구문을 사용하는 것을 선호하며, null 검사를 위해 더 유지 관리 가능하다고 생각합니다.또한 가 걸린 어떤 것이든 주장하고 싶습니다.operator==
또한 검를제합니다야공해에 대한 .null
그리고 어떤 이유로 그렇지 않은 경우(이상할 수도 있음), 그 결정 뒤에는 과부하를 사용하게 하는 구체적인 근거가 있을 수 있습니다.ReferenceEquals
.
c#7에서는 다음을 사용할 수 있습니다.
if ( !(myObject is null) )
와 동등합니다.
if (!ReferenceEquals(myObject, null))
만약 누군가가 = 또는 !== 운영자를 무시한다면, 그들은 그들이 원하는 것은 무엇이든 하게 만들 수 있습니다.심지어 그는 그것이 정말로 의미있는 것을 하도록 할 수 있습니다.return true;
또는return false;
또한 오버로드된 연산자가 있는 경우 성능이 저하될 가능성이 높습니다.ReferenceEquals
(보장되지 않고, 아마도 중요한 것은 아니지만, 여전히).
그렇긴 하지만, 과부하된 운영자의 합리적인 구현으로 인해 이것은 전혀 문제가 되지 않을 것 같습니다.개인적으로 사용하지 않습니다.ReferenceEquals
제가 그것을 사용하지 않을 특별한 이유가 없는 한.==
해당 유형 또는 특정 인스턴스에 대한 연산자입니다.
Null 검사의 경우 두 검사는 항상 동일한 결과를 반환해야 합니다.ReferenceEquals 또는 == 연산자가 사용되었는지 여부에 관계없이 null이 아닌 참조가 Null과 동일한 경우(NullObject 패턴을 사용하는 경우에도) 매우 좋지 않습니다.따라서 이 시나리오에서는 ==/!=를 사용할 것입니다.
== 연산자에 과부하가 걸린 경우 ReferenceEquals를 사용하는 것이 조금 더 빠를 수 있습니다.오버로드된 ==가 먼저 해야 할 일은 두 변수가 동일한 개체를 가리키는지 확인하는 것입니다. 따라서 오버로드된 연산자의 경우 콜 스택에 추가 프레임이 있게 됩니다.또한 ReferenceEquals를 사용하면 이 검사만 수행됩니다.
저는 일반적으로 거의 다른 시나리오에서도 ==/!=를 사용합니다.전체 아이디어는 연산자가 "평등"을 정의한다는 것입니다. 이것은 항상 참조적인 것은 아닙니다(사실, 대부분의 복합 객체는 평등을 위해 구조적으로 비교되어야 합니다; 그들의 구성원이 동일하면 동일합니다).이론적으로, 그 대상은 다른 대상과 비교하는 가장 좋은 방법을 알고 있습니다. 평등, 상대적 순서 등을 위해서 말이죠. 매우 구체적이고 어쩌면 잘못된 논리의 조각을 하드 코딩하기 보다는, 그 대상이 다른 것과 동등한지 아닌지를 알려주기 위해 그 언어의 대상 지향적인 특성을 사용해야 합니다.
에 이 VB를 포함해야 했습니다.NET 태그는 달리 언급되지 않았기 때문에 이 질문에 포함되지 말았어야 했지만, 완전성을 위해,Is
는 와동합다니등다에 합니다.Object.ReferenceEquals
그래서 그 통화 대신에 항상 사용할 수 있습니다.
그래서 저는 이 대화가 100만년 전의 것임에도 불구하고 이 대화에 끼어들고 싶었습니다.
null을 확인하는 확장 메서드를 작성하려고 합니다.다음을 수행할 수 있습니다.
public static bool IsNull<T>(this T value) where T : class, new()
{
return value == null;
}
하지만 이 코드는 지루합니다.
그 이유는 T가 수업이 되어야 한다는 것입니다. 왜죠?값 유형을 null로 비교할 수 없기 때문입니다.그래서 괜찮은 제네릭 코드를 작성하는 것은 큰 고통입니다.
또는 개체에 동일한 메서드를 연결하고 개체가 무엇인지 상관하지 않을 수 있습니다.
public static bool IsNull(this object value)
{
return object.ReferenceEquals(value, null);
}
이렇게 하면 실제로 일반 코드를 제한하지 않고 예를 들어 Linq에 대한 내결함성 모나드를 작성하거나 사용자가 가진 것과 같은 다른 가능성이 열립니다.
Reference Equals가 약간 더 빠를 수 있습니다.앞서 언급했듯이 오버로드된 Equals 연산자가 호출되지 않도록 합니다.또한 ReferenceEquals는 오버로드된 Equals 연산자의 구현에 따라 가능한 2가 아닌 하나의 비교만 수행되도록 합니다.그러나 오버로드된 연산자가 ReferenceEquals 자체를 첫 번째 문으로 사용하고 있을 가능성이 매우 높습니다.
저는 개인적으로 ReferenceEquals를 사용하지만, 마지막 클럭 주기(초당 수백만 번이라고 할 수 있는 주기)를 짜내기 위해 조정하는 곳에서만 사용합니다.내가 유형을 통제할 수 없을 때, 제네릭의 경우처럼...그러나 성능이 매우 중요한 경우에만 다시 한 번 강조합니다.
정말, 정말 답장이 늦었습니다. 하지만 EFCore 라이브러리를 읽다가 기사를 읽다가 우연히 이 방법을 발견했습니다.
Microsoft에는 Check 클래스가 있습니다.엔티티 프레임워크 코어입니다.null 검사에 이 논리를 사용하는 유틸리티...
internal static class Check
{
[ContractAnnotation("value:null => halt")]
public static T NotNull<T>([NoEnumeration] T value, [InvokerParameterName] [NotNull] string parameterName)
{
#pragma warning disable IDE0041 // Use 'is null' check
if (ReferenceEquals(value, null))
#pragma warning restore IDE0041 // Use 'is null' check
{
NotEmpty(parameterName, nameof(parameterName));
throw new ArgumentNullException(parameterName);
}
return value;
}
다른 답변에서 설명했듯이, 두 통화의 의미는 조금 다릅니다.
의 의미를 사용하고자 하는 경우ReferenceEquals
그러나 단순화된 구문을 사용하면 참조 유형에 대해 다음을 사용할 수도 있습니다.
if (myObject is object)
C# 9를 사용하면 다음을 사용할 수 있습니다.if (myObject is not null)
참조에는 다음과 같은 안전 보장이 명시되어 있습니다.
null에 대해 식을 일치시키면 컴파일러는 사용자 지정 == 또는 != 연산자가 호출되지 않도록 보장합니다.
받아들여진 답이 처음 작성된 지 10년이 지난 지금 올바른 것은 둘 다 아닙니다.
대신에,null
검사, 사용is null
또는is not null
.
그러나 질문의 본문에서 더 광범위한 질문도 했습니다.
에 어떤 이점이 있습니까?
ReferenceEquals
대==
?
큰 이점은 실제로 주소 평등을 원하는 경우가 드물다는 것입니다.그래서 저는 당신이 그것을 사용해서 써야 한다고 말하고 싶습니다.ReferenceEquals
강조하기 위해, 그리고 당신이 무시하는 것을 잊어버린 것은 단지 실수가 아니라는 것을 분명히 하라.operator==
.
정말로, 당신이 구현했다면 C# 컴파일러나 IDE 경고였으면 좋겠습니다.IEquatable<T>
그리고 무시하지 않았습니다.operator==
않은 상태를 입니다.operator==
전적으로, 그것은 실수보다 훨씬 더 자주 있기 때문에 저는 실제로 같은 주소를 원했습니다.
언급URL : https://stackoverflow.com/questions/12465961/is-referenceequalsmyobject-null-better-practice-than-myobject-null
'sourcecode' 카테고리의 다른 글
강조 표시된 상태에서 UI 단추의 배경색을 변경하는 방법은 무엇입니까? (0) | 2023.05.09 |
---|---|
해결 방법: 'keyWindow'는 iOS 13.0에서 더 이상 사용되지 않습니다. (0) | 2023.05.09 |
엑셀은 부동소수점 숫자가 부정확함에도 불구하고 어떻게 성공적으로 반올림합니까? (0) | 2023.05.09 |
병합을 미리 보려면 어떻게 해야 합니까? (0) | 2023.05.09 |
HEAD GIT은 무엇입니까? (0) | 2023.05.09 |