我鄙视出来的和裁判的作为方法参数。恕我直言,他们使代码不那么干净,并提供副作用的机会。但我承认我可能不了解他们的用处,这可能解释我的一部分厌恶。请问,有人可以解释一个有效的情况出来或参考?在方法中使用“out”或“ref”参数的正当理由是什么?
回答
基本上,如果你需要返回多个值,它是使用类似Tuple<,>
或自定义类型封装值的替代品。规范示例可能是int.TryParse
及相关方法。他们想要传达两个信息回:
- 分析得到的值
- 无论解析成功。
现在,这些可能实际上已经在这种情况下使用的int?
等返回类型编写的,但它是其他情况相同的原则。 (例如,Dictionary<,>.TryGetValue
,其中存储在字典中的值可以合法地为空)。
我不会说我鄙视out
和ref
参数,但我相信他们应该只偶尔使用,并且只当没有更好的选择。我在堆栈溢出中看到的大多数ref
的用法都是由于误解了参数传递。
'ref'用法的好例子是什么? –
@SaeedAmiri:大致相同,但您希望变量也可用作输入。这有点像有一个“in”参数和另一个“out”参数,除了调用者不能分开这两个参数:) –
对不起一个问题,为什么.net团队决定在tryparse中使用'out'而不是'ref'? –
out
提供了一种方法返回多个值。 ref
是相同的,但您可以也传中的值。
注意,您可以发生变异,即使没有ref
声明的对象(假设它是在第一时间当然是可变的)。
我宁愿out
另一种方法是使一个类来包含所有返回值,并返回类的一个实例。
不止一个,而不仅仅是两个。 –
“out”参数肯定会为副作用提供机会 - 它们要求该方法要么永远运行,要么异常终止,要么变异变量*。这是一个副作用。 –
它们几乎相同 - 唯一的区别是您作为out
参数传递的变量不需要初始化,并且使用参数out
的方法必须将其设置为某个值。
int x;
Foo(out x);
int y;
Foo(ref y);
Ref
参数是可能被修改的数据,out
参数是这对功能的额外输出已经在使用的东西的返回值数据(例如int.TryParse
)。
这是真的吗?参考文献未初始化时会得到什么错误? –
另外OP要求在.net中使用它(通过知道可用的替代方法)而不是它们的区别, –
@AshBurlaczenko:它当然是真的,如果你想知道你得到了什么错误,请启动编译器并找出。 –
“新”(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
空间。
为什么简单地返回一个布尔值是不够的原因是一个例外可以在Monitor.Enter
的return true
和bool acquiredLock =
之间的一个问题:“离开你的程序锁tacken发生?“ref
参数解决了这个问题
+1我正在寻找好的参考样本 –
但是,为什么不'var acquiredLock = Monitor.Enter(lockObject)'?尽管使用了'ref',我拒绝这是'*好需要*'。可以说标准的'Dictionary.TryGetValue'是一个更好的例子,因为它有两个必须返回的值(key found和value)。 – 2011-10-15 20:14:50
@pst:再次阅读最后一段。您不能*返回*锁是否被采用,因为当返回值被放到“堆栈”和返回值被复制到变量中时,*之间可能会有一个异常*。 –
- 1. 不能在匿名方法中使用ref或out参数
- 2. 从匿名方法调用ref或out参数的方法
- 3. 什么时候应该out和ref参数在C#中使用?
- 4. 为什么我需要用out或ref前缀参数?
- 5. 表达式树:调用一个方法与out或ref参数
- 6. 不能在lambda表达式中使用ref或out参数
- 7. C#不能在一个匿名方法体内使用ref或out参数
- 8. 在分机中使用“ref”或“out”
- 9. Out和Ref参数与FakeItEasy
- 10. 在递归函数中使用Ref/Out作为参数
- 11. 元组对与REF/out参数的方法的异步版本
- 12. 在什么情况下'out'参数有用(其中'ref'不能用来代替)?
- 13. 在html中使用多个ref值的正确方法是什么?
- 14. 当TryXxxx方法返回false时,out参数的标准行为是什么?
- 15. Vala中“ref”和“out”关键字的用途是什么?
- 16. C#:如果正在传递一个对象变量,是否使用ref/out来创建方法参数?
- 17. 传递由ref和out
- 18. 为什么必须使用“out”而不是ref?
- 19. 为什么字段可以用作out/ref参数而不是属性?
- 20. 为什么在匿名方法中不允许out参数?
- 21. 在Doxygen中引用参数的正确方法是什么?
- 22. 使用“ref”和/或“out”对象类型
- 23. PL/SQL中的IN,OUT,IN OUT参数到底是什么
- 24. 处理可选方法参数的常用方法是什么?
- 25. 使用可选参数处理函数重载的正确方法是什么?
- 26. 当使用const std :: string&作为方法参数类型时,处理nullptr const char *的正确方法是什么?
- 27. 什么是在ref中弹出PersistentQueue的惯用方法?
- 28. 在指针参数上使用ref和out关键字
- 29. ref和out有什么区别?
- 30. 为什么'ref'和'out'支持多态?
你在问这两者之间的区别,或者一般使用它们的目的是什么?为什么这个标记为java? – Marlon
你认为他们如何提供机会对于副作用? – svick
http://stackoverflow.com/questions/635915/when-to-use-ref-and-when-it-is-not-necessary-in-c-sharp –