0

以下是 C#,尽管代码模式可能与任何 OO 语言相关。

我有两种方法,MethodWithTry 和 MethodWithSomeReturnValue,我认为它们在功能上是等效的。我想知道其中一个是否是“正确”的方式。是否有一些东西(例如并发)使它们中的一个成为一个糟糕的选择。

    public void MethodWithTry()
    {
        int returnValue;
        string someInput;

        if (TryGetValueThisWay(someInput, returnValue))
        {
            //do something this way
        }
        else
        {
            if (TryGetValueThatWay(someInput, returnValue))
            {
                //do something that way
            }
            else
            {
                //do something a default way
            }
        }
    }

    public void MethodWithSomeReturnValue()
    {
        int? returnValue;
        string someInput;

        returnValue = GetValueThisWay(someInput);
        if (returnValue != null)
        {
            //do something this way
        }
        else
        {
            returnValue = GetValueThatWay(someInput);
            if (returnValue != null)
            {
                //do something that way
            }
            else
            {
                //do something a default way
            }
        }
    }

被调用方法的签名是

    public int? GetValueThisWay(string input)
    public int? GetValueThatWay(string input)
    private bool TryGetValueThisWay(string input, out int value)
    private bool TryGetValueThatWay(string input, out int value)

编辑——附加信息

被调用的方法是在集合中进行查找。所以可能有不同的名字

public int? GetValueFromCollectionA()
public int? GetValueFromCollectionB()

恕我直言,TrySomeMethodName - 使代码更具可读性。但是,使用 OUT 变量,尤其是当返回值为整数时,意味着它始终是可变的并且至少分配了两次(默认设置为 0)。

4

3 回答 3

0

根据今天编写此方法的返回类型 - 假设操作可能会失败,这是整个工作流程的一部分 - 我将返回一个可为空的结构或null引用值而不是Tryxxx方法 - 必须使用out值在我的意见。

 public int? MethodWithSomeReturnValue()
 {
    //return null in failure case
 }

 int? result = MethodWithSomeReturnValue();
 if(result != null)
 {
   //...
 }
于 2012-05-16T19:35:47.193 回答
0

嗯,这取决于。也许这将是您从愿意回答您的每个人那里得到的答案有时你知道或者你可以假设一个值总是来自某种类型,你可以使用 GetValue 或 ConvertToInt32(例如),例如从具有定义类型的数据库中获取值。但是其他时候您不能信任输入并且您不确定它是哪种类型,例如用户输入......在这种情况下,您可能更喜欢使用 TryGetValue 或 TryParse(例如)。所以最终取决于你。

于 2012-05-16T19:36:35.337 回答
0

如果您对值类型(如int)进行操作并且您的方法的结果可以是null,您应该选择Try版本。这是因为值类型不能很好地与null. 例如int?,比int由于引入的拳击慢得多?。所有 .NETTryParse方法都使用值类型,它们都遵循这种模式。我认为遵循这种方法很好。

当您开始对引用类型进行操作时,使用方法结果并null在需要时返回变得更加自然。

于 2012-05-16T20:07:42.453 回答