C#ref / out参数与懒惰

时间:2011-02-22 17:20:03

标签: c# .net

我有一个方法,它有几个“out”参数。它们在函数内部应该设置为值。但在某些情况下,编译器不够聪明,并且在任何执行路径中都没有设置参数值。这就是我必须在方法开头将默认值设置为out参数的原因。但由于此方法是具有多个实现的接口的一部分,因此该初始化代码是重复的。我不喜欢它。

您认为有哪些方案可以解决此问题?我看到的一个选项是使用ref而不是out。它在概念上并不正确,因为它不保证在方法内设置参数值。但事实上它是相同的(因为我在函数的开头设置了默认值,这意味着在这种情况下不能保证在方法中设置实际值。)

还有其他选择吗?

2 个答案:

答案 0 :(得分:13)

就个人而言,我尽量避免使用具有“多个”refout参数的方法。

只要您创建的方法具有多个refout参数,就个人而言,我觉得是时候考虑重构以使其返回自定义类型({{1}包含所有数据的}或class,具体取决于上下文)。这有许多优点,特别是因为它允许该类型在类型构造中处理其自身的验证以确保正确性。

如果您有“多个实现”,则尤其如此 - 因为这样可以大大降低出错的可能性,并消除大部分重复的代码(因为它可以进入新类型)。

答案 1 :(得分:10)

任何具有多个输出参数的方法都是一种设计气味,说实话。你真的需要这些是单独的参数,而不是一个封装良好的返回值吗?只有在价值观无关的情况下才会出现这种情况......在这种情况下,您的方法可能首先做得太多了。

实际上,我在框架中经常遇到out个参数的唯一地方是TryParse方法 - 如果Tuple<T1, T2>在设计时可用,我怀疑首先应该使用它。或者,ParseResult<T>结构是合适的。