C# 尝试从方法检索成功/失败和对象时要选择哪种模式?

C# 尝试从方法检索成功/失败和对象时要选择哪种模式?,c#,coding-style,naming-conventions,design-patterns,out,C#,Coding Style,Naming Conventions,Design Patterns,Out,我正在和同事讨论不同的实现技术 备选方案A User user; if (users.TryGet(1, out user)) Console.WriteLine(user.ToString()); else Console.WriteLine("Failed to get user.."); 备选方案B ResultSet<User> result = users.Get(1); if(result.OK) Console.WriteLine(use

我正在和同事讨论不同的实现技术

备选方案A

User user;
if (users.TryGet(1, out user))
    Console.WriteLine(user.ToString()); 
else
    Console.WriteLine("Failed to get user.."); 
备选方案B

ResultSet<User> result = users.Get(1); 
if(result.OK)
    Console.WriteLine(user.ToString()); 
else
    Console.WriteLine("Failed to get user.."); 
ResultSet result=users.Get(1);
if(result.OK)
Console.WriteLine(user.ToString());
其他的
Console.WriteLine(“未能获取用户…”);
备选方案A的行为类似于
int.Parse(字符串,输出值)
,并且易于扩展和读取。当成功看起来简单易读时,向输出添加更多对象

备选方案B似乎有点复杂,因为每行上有更多的代码。但是可以扩展为在
结果集中包括其他信息以及返回的对象。返回多个对象或任何有关变通方法的想法是否更困难

使用这样的参数是否被认为是丑陋/糟糕的做法

一般来说,微软。一种适当的方法是,如果一个方法无法完成由其名称标识的作业,则抛出异常。在这种情况下,如果
Get
方法无法获取数据记录,则应该存在异常。如果这种情况经常发生,您可以使用备选方案B来稍微提高性能,而不是每次抛出异常。

至于备选方案A,在这种情况下,方法应命名为
TryGet
,以符合FCL命名约定(
TryParse
TryGetValue
等)。

这两种方法的问题是,您不知道用户检索失败的原因

例如,如果您的
Get
TryGet
方法如下所示

public bool TryGet(int userId, out User user) {
    try {
        var conn = CreateDbConnection();
        var myUser = GetUser(userId, conn);
        user = myUser;
        return true;
    }
    catch {
        return false;
    }
}
。。。那么您就无法知道在检索用户时失败了什么。可能无法创建DB连接,可能不存在具有指定ID的用户,等等

更好的方法可能是:

public MyUser GetUser(int userId) {
    MyDbConnection conn;
    try {
        conn = CreateDbConnection();
    }
    catch (Exception ex) {
        throw new Exception("The DB connection could not be created.", ex);
    }
    MyUser myUser = GetUser(userId, conn);
    if (myUser == null)
        throw new Exception("No user exists with the ID '" + userId + "'.");
    return myUser;
}    

这样,您就知道了失败的地方,并且有了更好的消息可以进一步登录到链的上游。

为什么不在获取之前检查用户是否存在?