根据标题,将引用类型传递给方法,例如:
public void GetStream(Stream outputStream)
{
outputStream.Write(data);
}
VS
public Stream GetStream()
{
MemoryStream ms = new MemoryStream();
ms.Write(data);
return ms;
}
我注意到很多Java代码都是通过引用传递的(不确定这个的确切原因)。但是在.NET中,这只是一个偏好问题?
你什么时候选择一个?
答案 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”不是传入的参数时。这实际上是两个独立的函数,应该以这种方式编码。
但对于原始问题,通过引用传递只是意味着该方法可以选择修改对象的实例。使用返回值返回一个新的或现有的引用,是编写不可变对象的一个步骤,绝对值得考虑作为一种实现。