C# dotnet返回2种类型中的1种
我有一个简单的方法设置来创建条目,如果成功,返回创建的条目。如果没有返回ValidationErrorC# dotnet返回2种类型中的1种,c#,.net,C#,.net,我有一个简单的方法设置来创建条目,如果成功,返回创建的条目。如果没有返回ValidationError public async Task<MyNewEntry> CreateEntry(MyUser user, MyEntryRequest entry) 公共异步任务CreateEntry(MyUser用户,MyEntryRequest条目) 如果条目有效,这将非常有效。但是,如果验证失败,我想返回ValidationError 我试着这样做: public async Tas
public async Task<MyNewEntry> CreateEntry(MyUser user, MyEntryRequest entry)
公共异步任务CreateEntry(MyUser用户,MyEntryRequest条目)
如果条目有效,这将非常有效。但是,如果验证失败,我想返回ValidationError
我试着这样做:
public async Task<MyNewEntry | ValidationError> CreateEntry(MyUser user, MyEntryRequest entry)
公共异步任务CreateEntry(MyUser用户,MyEntryRequest条目)
但它不会编译。如何构造此方法,使其能够返回
MyNewEntry
或ValidationError
要执行此操作,您可以使用一个结果类型,它由一个属性“bool Success”和一个错误以及一个条目属性组成,该属性始终只有一个值填充,取决于你的方法是否成功
public class CreateEntryResult
{
public bool Success {get;set;}
public MyNewEntry Entry {get;set;}
public ValdidationError Error {get;set;}
}
为了节省一些内存(您将在每个结果上创建一个额外的对象),您还可以返回一个struct。只需将代码中的“class”关键字替换为“struct”。然后,包含的引用将作为值传递,您不必考虑对垃圾收集的任何影响
另一种方法是“Try”模式,近年来我很少看到这种方法,在这种模式中,您返回一个结果类型(通常是bool)并使用out参数返回值。
我不知道out参数如何与async一起工作
bool TryCreateEntry(..., out MyNewEntry entry, out ValidationError error)
哎呀,没有什么内置的。您可以将它们包装在一个结构中(比如),或者将验证错误包装在一个异常中,或者将一个作为out参数返回,如果设置了,则将另一个作为null返回,但我不确定它们是否都是超级干净的。返回两种不同的类型通常是个坏主意。您只需在MyNewEntry类中设置一个表示成功或失败的“有效”标志即可。我想我只需要创建一个知道如何处理它的包装器类?家长班?听起来你真的应该抛出一个异常。验证失败不是编译时可以解决的问题这将是异常驱动的设计,考虑到异常对应用程序的影响,在任何情况下都应该避免这种情况。当您知道可能发生的情况时,避免抛出异常。验证结果,无论是什么样的,都不是例外。