在方法中使用’out’或’ref’参数的正当理由是什么?

我鄙视和参考方法的参数。 恕我直言,他们使代码不那么干净,并提供副作用的机会。 但我承认,我可能不理解他们的用处,这可能解释了我厌恶的一部分。 请问,有人可以解释一下有效的案例或参考吗?

基本上,如果您需要返回多个值,则可以选择使用Tuple<,>或自定义类型来封装值。 规范示例可能是int.TryParse和相关方法。 他们想要传达两条信息:

  • 解析后的值
  • 解析是否成功。

现在这些实际上可以使用返回类型的int?编写int? 在这种情况下,等等,但对于其他情况,它是相同的原则。 (例如, Dictionary<,>.TryGetValue ,其中存储在字典中的值可能合法地为null。)

我不会说我鄙视ref参数,但我确实认为它们只应偶尔使用,并且只有在没有更好的选择时才会使用。 我在Stack Overflow上看到的ref大多数用法都是由于对参数传递的误解。

out提供了一种返回多个值的方法。 ref是相同的,除了你也可以传入一个值。

请注意,即使声明没有ref ,也可以改变对象(假设它在第一个位置是可变的)。

我更喜欢的替代方法是创建一个包含所有返回值的类,并返回该类的单个实例。

“new”(C#4.0) lock使用ref (从技术上讲, lock语句是新的Monitor.Enter重载的语法糖)。 没有:-)就不可能做到这一点

 bool acquiredLock = false; try { Monitor.Enter(lockObject, ref acquiredLock); // Code that accesses resources that are protected by the lock. } finally { if (acquiredLock) { Monitor.Exit(lockObject); } } 

所以在非常关键的地方有空间供ref

简单地返回一个bool值的原因是,在Monitor.Enterreturn truebool acquiredLock =之间可能发生exception,让你的程序“问题是锁定了吗?” 使用ref参数解决了这个问题。

它们几乎相同 – 唯一的区别是你作为out参数传递的变量不需要初始化,并且使用out参数的方法必须将其设置为某个值。

 int x; Foo(out x); int y; Foo(ref y); 

Ref参数用于可能被修改的数据, out参数用于数据,该数据是已经使用某些东西的返回值的函数的额外输出(例如int.TryParse )。