为什么要创建一个Try方法+输出vs检查一些默认值(即NULL)

时间:2012-05-16 19:21:19

标签: c# return-type out

以下是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)。

3 个答案:

答案 0 :(得分:0)

取决于今天编写此方法的返回类型 - 假设操作可能失败,并且这是整个工作流程的一部分 - 我将返回一个可为空的结构,或null在我看来,参考值而不是Tryxxx方法 - 必须使用out值非常麻烦。

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

 int? result = MethodWithSomeReturnValue();
 if(result != null)
 {
   //...
 }

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您使用值类型(例如int)并且方法的结果可以是null,那么您应该使用Try版本。这是因为值类型与null的混合不太好。例如,由于int?引入了装箱,int?慢。所有.NET TryParse方法都使用值类型,它们遵循此模式。我认为顺应这种方法是件好事。

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