在c#的上下文中,我有点陷入使用ref / out参数的自我冲突中?使用这些参数会增加我使用的方法或组件的耦合吗?
我现在没有明确的例子。我只是想知道使用这种结构是否是一个很好的软件设计。
恕我直言,方法的结果应该通过方法的返回值传回。
您的意见是什么?这个主题更像是一个设计主题,而不是技术主题。
答案 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非常有用。
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;
}