Esistono molti metodi comuni bool TryXXX(out T result)
in .NET BCL, l'essere più popolare, probabilmente, int.TryParse(...)
.async TryParse (...) modello
Vorrei implementare un metodo asyncTryXXX()
. Ovviamente, non posso usare i parametri out
.
Esiste uno schema stabilito per questo?
Più precisamente, ho bisogno di scaricare e analizzare un file. È possibile che il file non esista.
Questo è quello che mi è venuto in mente finora:
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; }
}
Fino a quando non viene implementata questa sintassi https://github.com/dotnet/roslyn/issues/347, sembra che si sia condannati a restituire il proprio tipo.Almeno utilizzare Tuple (o un tipo personalizzato migliore con nomi di proprietà ragionevoli come Success e Result), non KeyValuePair. –
Evk
Thx per il link, bella proposta! Qual è il vantaggio di Tuple <> su KVP <>? Ho sempre bisogno di restituire esattamente due elementi, il risultato vero/falso e il carico utile effettivo. Odio i nomi delle proprietà di 'Tuple <>' ('.Item1',' .Item2' ... completamente opachi a ciò che contiene la tupla.). 'KVP' non è molto meglio (nel mio scenario), ma almeno' .Value' rende * un po '* senso. –
La differenza è solo semantica. KeyValuePair è, beh, chiave + valore. Nel tuo caso, niente è davvero importante. La tupla ha solo due (o più) valori arbitrari - il tuo caso. Se non ti piacciono i nomi, crea la tua classe TryAsyncResult con le proprietà bool e T con i nomi appropriati. Hai solo bisogno di una classe di questo tipo per tutte le tue operazioni Try (a causa di generici). –
Evk