使用ref参数 - 好的设计决策?

时间:2012-03-07 11:12:53

标签: c# software-design

在c#的上下文中,我有点陷入使用ref / out参数的自我冲突中?使用这些参数会增加我使用的方法或组件的耦合吗?

我现在没有明确的例子。我只是想知道使用这种结构是否是一个很好的软件设计。

恕我直言,方法的结果应该通过方法的返回值传回。

您的意见是什么?这个主题更像是一个设计主题,而不是技术主题。

4 个答案:

答案 0 :(得分:1)

这与耦合没有任何关系。这是一种编码风格。就个人而言,我不喜欢 ref / _ out_参数,特别是当它们用于从函数调用中返回多个值时。我更喜欢创建一个包装预期返回值的自定义类,而不是返回多个 out 参数。

答案 1 :(得分:1)

对于正常情况,我认为通过引用传递参数不是一个好的设计决定。

因为您不知道函数对该对象的作用。

应该将函数解耦以确定其角色。

答案 2 :(得分:0)

如果您必须返回超过1个值,该怎么办?如果返回值表示成功/失败,您还需要返回某些计算/处理的值?

例如,当方法需要重新分配引用类型时,需要'ref'参数。

使用将受到相关具体用例的更多控制。

答案 3 :(得分:0)

在某些情况下,同时使用两个修饰符都很有用。 我只想给你一些关于它的例子。

字典是使用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

当需要更改被调用方法之外的现有对象时,

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;
}