반응형
"값 유형과 'null'의 가능한 비교"는 어떻게해야합니까?
커스텀 NUnit Constraint에 대해이 메서드를 작성하는 동안.
private void AddMatchFailure<TExpected, TActual>(string failureName, TExpected expected, TActual actual)
{
_matchFailures.Add(
String.Format(MatchFailureFormat, failureName,
(expected == null) ? "null" : expected.ToString(),
(actual == null) ? "null" : actual.ToString()));
}
ReSharper에서 그에게 경고 expected
하고 actual
있을 ValueType
것입니다.
예 : TExpected는 DateTime입니다. 예상 == null; // 그러나 DateTime은 신입니다.
ValueType을 null과 중요 할 때 규칙은 무엇이며 클래스 제약 조건을 추가하여 일반 매개 변수를 제한하지 않고 그것을 설명하는 메소드를 어떻게 작성해야합니까?
코드를 변경하지 말고 경고 만 무시하십시오. 유형 매개 변수가 nullable이 아닌 값 유형 인 경우 비교는 항상 실패하고 항상 ToString()
대신 호출 됩니다. 나는 그것이 중요한 것이 JITted인지 여부는 모르지만 놀라지 않을 것입니다 ... 그리고 이것은 어쨌든 성능에 코드처럼 들리지 않습니다 :)
개인적으로 경고를 "켜짐"으로 두고두고이 특별한 경우에는 무시합니다.
LINQ to Objects를 다시 구현할 때 동일한 경고가 몇 번 발생했다고 생각합니다.
ValueType을 null과 중요 할 때 규칙은 무엇이며 클래스 제약 조건을 추가하여 일반 매개 변수를 제한하지 않고 그것을 설명하는 메소드를 어떻게 작성해야합니까?
참조 유형이 될지 모르는 경우 다음과 같이 말할 수 있습니다.
private void AddMatchFailure<TExpected, TActual>(
string failureName,
TExpected expected,
TActual actual
) {
_matchFailures.Add(
String.Format(MatchFailureFormat, failureName,
IsDefault<TExpected>(expected) ? DefaultStringForType<TExpected>() : expected.ToString(),
IsDefault<TActual>(actual) ? DefaultStringForType<TActual>() : actual.ToString()
);
}
private bool IsDefault<T>(T value) {
if(typeof(T).IsValueType) {
return default(T).Equals(value);
}
else {
return Object.Equals(null, value);
}
}
private string DefaultStringForType<T>() {
if(typeof(T).IsValueType) {
return default(T).ToString();
}
else {
return "null";
}
}
제네릭 유형에서 null을 확인하기 위해 다음과 같은 것을 사용하고 있습니다.
if (Equals(result, Default(T)))
private void AddMatchFailure<TExpected, TActual>(string failureName, TExpected expected, TActual actual)
{
_matchFailures.Add(
String.Format(MatchFailureFormat, failureName,
(expected == default(TExpected)) ? "null" : expected.ToString(),
(actual == default(TActual)) ? "null" : actual.ToString()));
}
해야합니다.
default(T)
null 인 참조 유형의 해당 유형의 경우를 제공합니다. (Enums (enumType)0
는 예를 들어 동일합니다 ).
반응형
'ProgramingTip' 카테고리의 다른 글
C # : "System.Object"와 "object"의 차이점 (0) | 2020.10.30 |
---|---|
memcpy (0,0,0)을 수행하는 것이 안전을 수행합니까? (0) | 2020.10.30 |
"서명 된 / 서명되지 않은 불일치"경고 (C4018)를 어떻게 처리합니까? (0) | 2020.10.30 |
공급 업체별 의사 요소 / 클래스를 하나의 규칙 세트로 결합 할 수없는 이유는 무엇입니까? (0) | 2020.10.30 |
Spring 5.0.3 RequestRejectedException : URL이 갑자기 발생하지 않아 요청이 거부되었습니다. (0) | 2020.10.30 |