使用ref参数-良好的设计决策
本文关键字:决策 ref 参数 使用 | 更新日期: 2023-09-27 18:26:57
在c#的上下文中,我有点陷入了关于使用ref/out参数的自我冲突?这些参数的使用是否会增加我使用的方法或组件的耦合?
我现在没有明确的例子。我只是想知道使用这种结构是否是一个好的软件设计。
IMHO方法的结果应该通过该方法的返回值返回。
你有什么意见?这个主题与其说是技术主题,不如说是设计主题。
这实际上与耦合无关。这是一种编码风格。就我个人而言,我不喜欢ref/out_参数,尤其是当它们用于从函数调用返回多个值时。我更喜欢创建一个封装预期返回值的自定义类,而不是返回多个out参数。
对于正常情况,我认为通过引用传递参数不是一个好的设计决策。
因为你不知道函数对那个对象做了什么。
功能应该解耦,以真正确定其角色。
如果必须返回超过1个值怎么办?如果返回值表示成功/失败,并且您还需要返回某些计算/处理的值?
例如,当方法需要重新分配引用类型时,需要"ref"参数。
使用将更多地受所讨论的具体用例的支配。
在某些情况下,同时使用两个修饰符是有用的。我只想给你举几个例子。
out
字典是使用out参数的一个很好的例子。如果你想知道字典中是否包含密钥,并想在密钥存在的情况下检索值,你可以这样做:
MyType result;
if (myDictionary.TryGetValue(myKey, out result))
{
// Use result
}
如果你不能使用out参数,你就必须这样写:
Dictionary<KeyType, MyType> myDictionary = ...;
if (myDictionary.ContainsKey(myKey))
{
MyType result = myDicionary[myKey];
}
这会对性能产生影响,因为字典必须搜索两次关键字。另一种可能性是:
Dictionary<KeyType, MyType> myDictionary = ...;
Dictionary<KeyType, MyType>.TryGetResult result = myDictionary.TryGetValue(myKey);
if (result.Succeeds)
{
MyType resultValue = result.Value;
}
这是可用的,但在我看来不如out解决方案好,因为你必须为结果创建一个额外的结构或类,当然,代码也不那么干净。
参考
当需要更改被调用的方法之外的现有对象时,Ref是有用的。
MyObject myvar = myStream.ReadMyObject();
if (dataProcessor.Process(ref myvar)) {.... }
// Data processor....
public Boolean Process(ref MyObject myvar)
{
if (!myvar.IsClean)
{
myvar = new MyObject(); // Create clean object
return false;
}
return true;
}