我继承了一些广泛而不必要地使用ref关键字的代码.如果不使用ref,原始开发人员显然担心对象会被克隆为原始类型,并且在编写50k +代码行之前没有费心去研究这个问题.
这与其他不良编码实践相结合,创造了一些表面上非常危险的情况.例如:
Customer person = NextInLine();
//person is Alice
person.DataBackend.ChangeAddress(ref person, newAddress);
//person could now be Bob, Eve, or null
Run Code Online (Sandbox Code Playgroud)
你能想象走进商店改变你的地址,走出一个完全不同的人吗?
可怕,但在实践中,在这个应用程序中使用ref似乎是无害的多余.我无法证明清理它需要花费大量时间.为了帮助推销这个想法,我提出了以下问题:
我特别关心维护.具有实例的合理答案是优选的.
我们也欢迎你争辩说没有必要进行清理.
我想说最大的危险是如果参数null
由于某种原因设置在函数内部:
public void MakeNull(ref Customer person)
{
// random code
person = null;
return;
}
Run Code Online (Sandbox Code Playgroud)
现在,你不仅仅是一个与众不同的人,你已经完全被淘汰了!
只要开发此应用程序的任何人都理解:
默认情况下,对象引用按值传递.
和:
使用
ref
关键字,对象引用通过引用传递.
如果代码现在按预期工作,并且您的开发人员了解其中的差异,则可能不值得将其全部删除.