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