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

本文关键字:决策 ref 参数 使用 | 更新日期: 2023-09-27 18:26:57

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

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

IMHO方法的结果应该通过该方法的返回值返回。

你有什么意见?这个主题与其说是技术主题,不如说是设计主题。

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

这实际上与耦合无关。这是一种编码风格。就我个人而言,我不喜欢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;
}