通过引用传递与返回类实例
本文关键字:返回 实例 引用 | 更新日期: 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"不是传入参数时。这实际上是两个独立的函数,应该这样编码。
但是对于最初的问题,通过引用传递仅仅意味着该方法具有修改对象实例的选项。使用返回值来返回一个新的或现有的引用,是编写不可变对象的一个步骤,并且绝对值得作为一种实现来考虑。