c# - 引用滥用 : Worth Cleaning Up?

标签 c# ref

我继承了一些广泛且不必要地使用 ref 关键字的代码。最初的开发人员显然担心如果不使用 ref 对象会像原始类型一样被克隆,并且在编写 50k+ 行代码之前没有费心去研究这个问题。

这与其他不良编码实践相结合,造成了一些表面上非常危险的情况。例如:


Customer person = NextInLine(); 
//person is Alice
person.DataBackend.ChangeAddress(ref person, newAddress);
//person could now be Bob, Eve, or null

您能想象走进一家商店更改地址,然后以完全不同的方式走出去吗?


可怕,但在实践中在此应用程序中使用 ref 似乎是无害的多余。我无法证明清理它需要花费大量时间。为了帮助推销这个想法,我提出了以下问题:

对 ref 的不必要使用还有什么破坏性的?

我特别关心维护。最好有合理的答案和例子。

也欢迎您争论清理是没有必要的。

最佳答案

我想说最大的危险是如果参数由于某种原因在函数内部被设置为null:

public void MakeNull(ref Customer person)
{
    // random code
    person = null;
    return;
}

现在,你不仅仅是一个不同的人,你已经完全从存在中消失了!

只要开发此应用程序的人明白:

By default, object references are passed by value.

和:

With the ref keyword, object references are passed by reference.

如果代码现在按预期工作并且您的开发人员理解其中的区别,那么将它们全部删除可能不值得付出努力。

关于c# - 引用滥用 : Worth Cleaning Up?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/748878/

相关文章:

c# - 'System.Windows.Controls.Image' 不包含 'FromFile' 的定义

c# - 推荐具有属性的最佳构造函数?

c# - 在 .C# 和 NET 5 中,在 struct 和 Span<byte> 之间进行无不安全的转换,反之亦然

c# - 按引用传递引用与按值传递引用 - C#

c# - 如何在 DataGridView 中模仿 Windows 资源管理器的多选/拖放行为?

c# - 如何在sql命令中插入当前日期时间

C# 无法从 x.ISessionContext 转换为 y.ISessionContext

dll - C# CLR 异常 "BadImageFormatException: Could not load file or assembly"

c# - 系统.Data.SqlClient.SqlException (0x80131904) : Incorrect syntax near '.'

javascript - 无法在 React Native 中使用 useRef() 将 current.focus() 应用于按钮