1

首先让我提供上下文:

在 C# 中,传递给方法的对象是通过引用传递的。仅当使用关键字重新实例化传入的对象时,引用才会丢失new

所以,我喜欢做var obj = Alter(obj)(方法1)之类的事情,即我传入一个对象并返回该对象。与执行等效操作相反:(Alter(obj) 方法 2)引用对象的更改相同,除了通过引用而不是返回副本。我认为第一个更好,因为如果某些冒失的编码员后来修改代码以使用关键字“new”......现有代码不会烧毁和死亡。

我的问题是方法 1会比方法 2使用更多的内存还是会导致任何其他性能下降?即这会更频繁地调用 GC 吗?

答案是不

4

3 回答 3

4

在 C# 中,传递给方法的对象是通过引用传递的。仅当使用关键字 new 重新实例化传入的对象时,引用才会丢失

不,不,至少默认情况下不是。默认情况下,所有内容都按值传递。碰巧的是,在引用类型的情况下,按值传递的东西是引用。

因此,制作了参考的副本。这也反驳了第二个说法。您可以根据需要重新分配方法参数;您只是在修改副本。这也改变了您问题的含义,因为您继续说...

所以,我喜欢做类似 var obj = Alter(obj)(method 1)... 我认为第一个更好,因为如果某些冒失的编码员后来修改代码以使用关键字“new”...现有代码不会燃烧和死亡。

这种情况不会发生。其次,如果你和那些签入的代码完全不起作用并且他们没有测试过的程序员一起工作,你就会遇到更大的问题。但是,无论如何,在参考副本上“使用new关键字”是无关紧要的(至少在影响原件方面)。即使你的方法是正确的,这也会过于防御。

我的问题是;如果您的函数仅用于改变其单个输入的状态,那么为什么此方法不是开始类型的实例方法?

于 2012-08-09T03:59:05.377 回答
3

C# 从不复制引用类型。如果您将obj传递给您的方法然后返回它,那么这与您开始使用的对象实例完全相同。

这不会给 GC 带来额外的压力。

于 2012-08-09T03:45:42.290 回答
1

通常,不修改指定为方法输入的参数会更安全。至于性能,这两者之间的内存消耗差异几乎可以忽略不计,绝对不会成为您程序的性能瓶颈。这是一个未成熟优化的案例。

您应该选择更清洁、更安全的解决方案,除非您有证据表明性能差异导致程序出现问题。

于 2012-08-09T03:45:33.147 回答