Sto osservando un problema in cui un metodo può fallire in modo prevedibile. Per ora penso che le eccezioni potrebbero non essere un buon modo per rappresentare alcuni dei fallimenti (potrei sbagliarmi su questo). In ogni caso stavo pensando di restituire un tipo di risultato simile a quelli in ASP.NET Identity e quelli discussi in questa domanda - Qual è un buon progetto per un metodo che può restituire diversi risultati logicamente diversi? (es. una proprietà bool o enum Risultato e altre proprietà presenti se il risultato è positivo). Comunque dal momento che il C # 7 è stato rilasciato e ha un pattern matching mi chiedo se questa non sia una soluzione migliore
public abstract class ReadFileResult
{
}
public class FileNotFoundResult : ReadFileResult
{
}
public class BytesFileResult : ReadFileResult
{
public BytesFileResult(byte[] fileData)
{
FileData = fileData;
}
public byte[] FileData { get; }
}
class Program
{
static void Main(string[] args)
{
ReadFileResult readFileResult = ReadFile("test.txt");
switch (readFileResult)
{
case FileNotFoundResult fileNotFound:
{
Console.WriteLine("File not found");
}
break;
case BytesFileResult bytesFileResult:
{
Console.WriteLine(bytesFileResult.FileData.Length); //do something with the data
}
break;
default:
{
throw new Exception("Unexpected file result");
}
}
}
public static ReadFileResult ReadFile(string filename)
{
throw new NotImplementedException(); //some logic here
}
}
Preferiresti vedere il tipo di risultato "standard" tipo + proprietà o la modalità di corrispondenza del modello è più chiara? Se preferisci uno sull'altro perché? È possibile migliorare la soluzione basata sul pattern matching?
Modifica: solo per la cronologia questo esempio NON è il mio caso d'uso. Il mio caso d'uso specifico avrà bisogno di almeno 3 blocchi catch se vado per le eccezioni (che potrei ancora fare). Mi chino a restituire un risultato perché preferisco se oltre 3 blocchi di cattura anche se probabilmente andrei a fare un'eccezione se fosse solo un caso strano. In ogni caso la mia domanda è intesa a confrontare i due modi per restituire un risultato, non a discutere delle eccezioni rispetto ai risultati. Supponiamo che parli di ASP.NET Identity. Sarebbe meglio se invece di questa classe avevano un sacco di classi derivate e usato la corrispondenza dei pattern (supponendo che tutti i loro client usassero C # 7.0)