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

C# 使用ref参数-良好的设计决策?,c#,software-design,C#,Software Design,在c#的上下文中,关于使用ref/out参数,我有点陷入了自我冲突?这些参数的使用是否增加了我使用的方法或组件的耦合 我现在没有明确的例子。我只是想知道使用这种结构是否是一种好的软件设计 IMHO方法的结果应通过该方法的返回值传回 你怎么看?本主题与其说是技术主题,不如说是设计主题。这与耦合没有任何关系。这是一种编码风格。就个人而言,我不喜欢ref/_out_参数,尤其是当它们用于从函数调用返回多个值时。我更喜欢创建一个封装预期返回值的自定义类,而不是返回多个out参数。如果必须返回多个值,该怎

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

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

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


你怎么看?本主题与其说是技术主题,不如说是设计主题。

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

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

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


使用将更多地取决于所讨论的特定用例。

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

因为你不知道函数对那个对象做了什么


函数应该解耦以真正确定它的角色。

在某些情况下,两个修饰符都有用处。 我只想给你们举几个例子

出来 字典是使用out参数的一个很好的例子。如果您想知道字典是否包含键,并想检索该键存在时的值,您可以这样做:

MyType result;
if (myDictionary.TryGetValue(myKey, out result))
{
    // Use result
}
Dictionary<KeyType, MyType> myDictionary = ...;
if (myDictionary.ContainsKey(myKey))
{
    MyType result = myDicionary[myKey];
}
如果无法使用out参数,则必须这样编写:

MyType result;
if (myDictionary.TryGetValue(myKey, out result))
{
    // Use result
}
Dictionary<KeyType, MyType> myDictionary = ...;
if (myDictionary.ContainsKey(myKey))
{
    MyType result = myDicionary[myKey];
}

如果这是正确的事情,那就是正确的事情。如果不是,那就不是。我不确定在没有实际例子的情况下还能说些什么?我的问题是这样做是否是一种好的编码风格。我刚刚从微软那里找到了一条很好的准则,可以在代码分析中激活。如果没有理由的话,他们为什么会这样说呢?正如链接所示……这对于“普通观众”来说是不可取的。如果您的特定用例可以不使用它,那么您应该避免它。否则,问题就归结为您是想定义一个新类型来返回多个返回值,还是使用几个ref参数。这正是我想做的。从技术上讲,您的示例是如何使用这些修饰符的。OP是关于设计决策的——我应该编写修改现有对象的方法吗?我是否应该编写将一个输出作为返回值,另一个作为输出参数返回的方法?@AvnerShahar Kashtan Theese示例说明了为什么在某些情况下使用它们是有用的,当然也说明了如何使用它们。这是一个设计决定,是一个50行的文本或一小部分代码留在你脑海中。特别是对于out示例,我制作了一个很好的示例,在这种情况下,使用修改器可能会很有用。