c# - 性能/风格 : Changing an object by reference vs returning a copy in C#

标签 c# .net performance garbage-collection styles

首先让我提供上下文:

在 C# 中,传递到方法中的对象是通过引用传递的。仅当使用关键字 new

重新实例化传入的对象时,引用才会丢失

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

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

The answer is NO

最佳答案

In C# an object passed into a method is passed via reference. The reference is only lost if the passed in object is re-instantiated with the keyword new

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

因此,制作了引用的副本。这也反驳了第二种说法。您可以随心所欲地重新分配方法参数;您只是在修改副本。这也改变了你问题的意思,因为你继续说......

So, I like to do things like var obj = Alter(obj)(method 1)... I would argue the first one is better since if some daredevil coder later modifies the code to use a keyword "new"... existing code won't burn and die.

不会出现这种情况。其次,如果您与 checkin 的代码完全不工作并且他们没有进行测试的程序员一起工作,那么您的问题就更大了。但是,无论如何,在引用副本上“使用 new 关键字”是无关紧要的(至少,就影响原始文件而言)。即使您的方法是正确的,这也会过于防御。

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

关于c# - 性能/风格 : Changing an object by reference vs returning a copy in C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11876469/

相关文章:

c# - 以编程方式定义脚本的执行顺序

c# - 为什么 XmlDictionary.Add() 返回 XmlDictionaryString?

c# - 使用前缀、后缀和分隔符连接字符串的最快方法

.net - 0.0.0.0 :1000 and *:1000 when calling UseUrls 和有什么区别

performance - F# 惯用性能

c - GCC 生成的 64 位代码比 32 位代码慢 3 倍

c# - 调用 ToList() 后的 Entity Framework 更改跟踪

C# - 如何返回基于字符串的类型

c# - 当绑定(bind)属性声明为接口(interface)类型与类类型时,WPF 绑定(bind)行为不同?

c++ - 最快的 C++ 有理数库