繁体   English   中英

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

[英]Pass by Reference vs Returning class instance

根据标题,将引用类型传递给方法有任何区别,例如:

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

VS

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

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

您何时会选择一个?

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

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


如果你的第一个例子是:

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

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

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

然而,从第二(返回值)更常见的-如果一个方法有一个单一的值返回,这是迄今为止优选该值由该方法返回,而不是一个void与方法out参数-主要是,在.NET中,应该谨慎使用out参数(并且只有当方法的返回值已经有用时)。 这种方法的一个示例是各种类型的TryParse方法,它们返回bool (表示成功),并且将解析后的值作为out参数传递回。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM