.NET BCL에는 일반적인 bool TryXXX(out T result)
메서드가 많이 있는데 가장 널리 사용되는 것은 아마도 int.TryParse(...)
입니다.비동기 TryParse (...) 패턴
비동기TryXXX()
메서드를 구현하고 싶습니다. 분명히 out
매개 변수를 사용할 수 없습니다.
거기에 맞는 패턴이 있습니까?
더 중요한 것은 파일을 다운로드하고 구문 분석해야합니다. 파일이 존재하지 않을 수도 있습니다.
이것은 내가 지금까지 해낸 것입니다 : 나는 다음과 같은 정의를 마련했습니다
public async Task<DownloadResult> TryDownloadAndParse(string fileUri)
{
try
{
result = await DownloadAndParse(fileUri); //defined elsewhere
return new DownloadResult {IsFound = true, Value = result}
}
catch (DownloadNotFoundException ex)
{
return new DownloadResult {IsFound = false, Value = null}
}
//let any other exception pass
}
public struct DownloadResult
{
public bool IsFound { get; set; }
public ParsedFile Value { get; set; }
}
이 구문 https://github.com/dotnet/roslyn/issues/347이 구현 될 때까지는 자신의 유형을 반환 할 운명에 처해있는 것 같습니다.적어도 Tuple (또는 KeyValuePair가 아니라 Success 및 Result와 같은 합리적인 속성 이름이있는 더 나은 사용자 정의 유형)을 사용하십시오. –
Evk
Thx 링크, 좋은 제안! Tuple <>이 KVP <>보다 어떤 이점이 있습니까? 항상 참/거짓 결과와 실제 페이로드라는 정확히 두 항목을 반환해야합니다. 나는 Tuple <>'('.Item1','.Item2' ...)의 속성 이름을 다소 싫어합니다. 튜플이 가지고있는 것에 완전히 불투명합니다. 'KVP'는별로 좋지는 않지만 (적어도 시나리오에서는),'.Value'는 적어도 어느 정도 의미가 있습니다. –
차이점은 의미입니다. KeyValuePair는 key + value입니다. 당신의 경우에는 아무것도 정말로 중요하지 않습니다. 튜플은 두 가지 (또는 그 이상)의 임의의 값입니다 - 귀하의 경우. 이름이 마음에 들지 않으면 Bool 및 T 속성이 적절한 TryAsyncResult 클래스를 적절한 이름으로 만듭니다. 모든 Try 오퍼레이션에 대해 하나의 클래스 만 필요합니다 (제네릭 때문에). –
Evk