默认使用ref关键字传递引用类型

Ash*_*Ash 4 c#

我与默认使用ref关键字传递引用类型(如StringBuilder,string和MemoryStream)的开发人员合作.他们这样做无论他们是否需要实际更改引用本身.

public void ExampleMethod(ref MemoryStream ms)
{
    byte b=ms.ReadByte();
    ...
    // No changing of actual ms reference such as: ms=new MemoryStream();
}  
Run Code Online (Sandbox Code Playgroud)

几乎总是,方法只使用对象并返回而不以任何方式更改引用.对于不可变类型,即字符串,这有时是必要的,但为什么对于可变类型?

对我而言,这有一点"代码味道",因为它可能会导致代码更少的可维护性,因为它比它真正需要的更宽松.

然而,这是否足以让我与开发人员见面呢?我的感觉是肯定的,但也许这太迂腐了?

Fre*_*els 17

也许你可以问开发者他为什么这样做......也许他(错误地)认为它更有效率?也许开发人员是C++开发人员,他认为使用ref类似于在C++中使用指针?

如果他来自C++背景,我会问开发人员为什么这样做,并向他解释这完全没有必要.它不会提高性能,而是为方法提供不同的语义,因为它允许更改引用,并且只有在方法确实需要更改引用时才应使用ref关键字.

我不认为这是迂腐的.即使是经验丰富的开发人员也不知道他正在使用的新语言的所有内容.当你向他解释时,他会学到新的东西,也许他会感激不尽.:)


Jon*_*eet 6

绝对值得提出来.我已经多次看到这种情况,而且一直是由于开发人员不了解类型系统 - 这是编写正确和可维护代码的关键部分.

我会找到一个例子,它显然没有必要,但是他们想要改变对象本身的内容 - 附加到a的东西StringBuilder是理想的.然后礼貌地问他们为什么选择使用ref修饰语.指出它在没有的情况下也能正常工作.

请随意将它们引用到我的参数文章和我的参考/价值类型文章中.