예로 C # 1 클래스에 패턴 존재 Dictionary.TryGetValue
하고 int.TryParse
: 방법은 복귀 동작과 실제 결과를 포함하는 출력 파라미터의 성공을 나타내는 부울; 작업이 실패하면 out 매개 변수가 null로 설정됩니다.
내가 nullable이 아닌 C # 8 참조를 사용하고 있고 내 클래스에 대해 TryParse 메서드를 작성하려고한다고 가정 해 봅시다. 올바른 서명은 이것이다 :
public static bool TryParse(string s, out MyClass? result);
거짓 인 경우 결과가 널이므로 출력 변수를 널 입력 가능으로 표시해야합니다.
그러나 Try 패턴은 일반적으로 다음과 같이 사용됩니다.
if (MyClass.TryParse(s, out var result))
{
// use result here
}
작업이 성공할 때 지점에만 입력하므로 해당 지점에서 결과가 null이되어서는 안됩니다. 그러나 그것을 nullable로 표시했기 때문에 이제 그것을 확인하거나 !
재정의 하는 데 사용해야 합니다.
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // compiler warning, could be null
Console.WriteLine("Look: {0}", result!.SomeProperty); // need override
}
이것은 추악하고 약간 비인간적입니다.
일반적인 사용 패턴으로 인해 다른 옵션이 있습니다 : 결과 유형에 대한 거짓말 :
public static bool TryParse(string s, out MyClass result) // not nullable
{
// Happy path sets result to non-null and returns true.
// Error path does this:
result = null!; // override compiler complaint
return false;
}
이제 일반적인 사용법이 더 좋아집니다.
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // no warning
}
그러나 비정형적인 사용법에는 다음과 같은 경고가 표시되지 않습니다.
else
{
Console.WriteLine("Fail: {0}", result.SomeProperty);
// Yes, result is in scope here. No, it will never be non-null.
// Yes, it will throw. No, the compiler won't warn about it.
}
이제 어느 길로 갈지 잘 모르겠습니다. C # 언어 팀의 공식 추천이 있습니까? 이 작업을 수행하는 방법을 보여줄 수있는 CoreFX 코드가 null이 아닌 참조로 이미 변환되어 있습니까? ( TryParse
메서드를 찾았습니다 . IPAddress
클래스가 하나 있지만 corefx의 마스터 분기에서 변환되지 않았습니다.)
그리고 일반적인 코드는 어떻게 Dictionary.TryGetValue
이것을 처리합니까? (아마도 MaybeNull
내가 찾은 것의 특수 속성으로 가능합니다 .) Dictionary
nullable이 아닌 값 형식으로 인스턴스화하면 어떻게됩니까 ?
MyClass?
) 및 acase MyClass myObj:
및 (선택 사항) 으로 스위치를 켭니다case null:
.