通过引用传递vs返回类实例

时间:2011-12-11 16:27:03

标签: c# pass-by-reference

根据标题,将引用类型传递给方法,例如:

public void GetStream(Stream outputStream)
{
   outputStream.Write(data);
}

VS

public Stream GetStream()
{
   MemoryStream ms = new MemoryStream();
   ms.Write(data);
   return ms; 
}

我注意到很多Java代码都是通过引用传递的(不确定这个的确切原因)。但是在.NET中,这只是一个偏好问题?

你什么时候选择一个?

2 个答案:

答案 0 :(得分:2)

两者非常不同。在第一个示例中,调用者负责创建一个流(他们喜欢的任何类型),并且可以传递已经位于某个任意位置的流。

在第二个中,被调用者已确定流的类型,并始终在位置0处写入。


如果你的第一个例子是:

public void GetStream(out stream outputStream)
{
   outputStream = new MemoryStream();
   outputStream.Write(data);
}

他们至少会更接近可比性。

这里,主要区别在于调用者有一个声明的变量来捕获outputStream,而在另一种情况下,调用者可以忽略返回的流值。

然而,第二个来自(返回值)更常见 - 如果一个方法有一个值要返回,那么到目前为止,该方法返回的值,而不是带void参数的out方法 - 主要是在.NET中,应谨慎使用out参数(并且只有当方法的返回值已经有用时)。这种方法的一个示例是各种类型的TryParse方法,它们返回bool(表示成功),并且解析后的值作为out参数传回。

答案 1 :(得分:1)

首先,“关注点分离”的概念表明,名为“GetStream”的方法也不应该写入流。特别是当“bytes”不是传入的参数时。这实际上是两个独立的函数,应该以这种方式编码。

但对于原始问题,通过引用传递只是意味着该方法可以选择修改对象的实例。使用返回值返回一个新的或现有的引用,是编写不可变对象的一个​​步骤,绝对值得考虑作为一种实现。