3 回答
TA贡献1851条经验 获得超3个赞
答案很长:当通过值传递引用类型参数时,只传递引用,而不是对象的副本。这就像在C或C ++中传递指针(按值)。调用者不会看到对参数本身值的更改,但会看到参考指向的对象的更改。
当通过引用传递参数(任何类型)时,这意味着调用者可以看到对参数的任何更改 - 对参数的更改是对变量的更改。
文章更详细地解释了所有这些,当然:)
有用的答案:你几乎不需要使用ref / out。它基本上是一种获得另一个返回值的方法,通常应该被准确地避免,因为这意味着该方法可能试图做太多。情况并非总是如此(TryParse
等等是合理使用的规范示例out
)但使用ref / out应该是相对罕见的。
TA贡献1836条经验 获得超4个赞
可以将非ref参数视为指针,将ref参数视为双指针。这对我帮助最大。
您几乎不应该通过ref传递值。我怀疑,如果不是互操作问题,.Net团队永远不会将其包含在原始规范中。处理ref参数解决的大多数问题的OO方法是:
对于多个返回值
创建表示多个返回值的结构
对于作为方法调用结果在方法中更改的基元(方法对基本参数有副作用)
在对象中实现方法作为实例方法,并在方法调用中操纵对象的状态(而不是参数)
使用多重返回值解决方案并将返回值合并到您的状态
创建一个包含可由方法操作的状态的对象,并将该对象作为参数传递,而不是基元本身。
TA贡献1856条经验 获得超11个赞
您可以编写一个完整的C#应用程序,并且不会通过ref传递任何对象/结构。
我有一位教授告诉我这件事:
您使用refs的唯一地方是:
想要传递一个大对象(即,对象/结构中有对象/结构到多个级别)并且复制它会很昂贵,
您正在调用Framework,Windows API或其他需要它的API。
不要因为你能做到这一点。如果您开始更改参数中的值并且没有引起注意,您可以通过一些令人讨厌的错误获得帮助。
我同意他的建议,在学校开始的五年多时间里,除了调用Framework或Windows API之外,我从未需要它。
- 3 回答
- 0 关注
- 1023 浏览
添加回答
举报