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

本文关键字:返回 实例 引用 | 更新日期: 2023-09-27 18:17:25

将引用类型传递给方法是否有区别,例如:

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

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,而在另一种情况下,调用者可以忽略返回的流值。

然而,第二个from(返回值)更常见-如果一个方法有一个值要返回,到目前为止,最好是该值是该方法返回的,而不是带有out参数的void方法-大多数情况下,在。net中,out参数应该谨慎使用(并且只有当方法的返回值已经有用时)。这种方法的一个例子是各种类型的TryParse方法,它们返回bool(表示成功),并将解析后的值作为out参数传递回来。

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

但是对于最初的问题,通过引用传递仅仅意味着该方法具有修改对象实例的选项。使用返回值来返回一个新的或现有的引用,是编写不可变对象的一个步骤,并且绝对值得作为一种实现来考虑。