C#'ref'关键字,性能

Dav*_*son 12 c# performance ref

如果你有一个Bitmap对象需要传递给众多方法(大约10个),最后到一个事件,它将在它被使用后最终被处理掉,是否(性能明智)将它传递给每一个那些方法通过引用而不是值?

按值传递,对象被复制,而不是通过引用传递.

(在这种情况下,性能至关重要.应用程序需要尽可能快地运行.)

Dav*_*son 32

位图是一种引用类型.按值传递引用类型不会复制对象,只会复制对象的引用.通过引用而不是按值传递Bitmap没有性能优势.


Jer*_*ine 17

由于Bitmap是一种引用类型,因此在此方案中性能没有实际差异,因为它已经通过引用方法传递.

我推荐Jon Skeet关于这个主题的文章,全面解释"按引用"和"按价值"如何在C#中工作.


Gis*_*shu 9

您正在使用哪种类型来保存位图?例如,System.Drawing.Bitmap是引用类型/类.传递对方法的引用(作为参数)时,引用将按值传递.(引用的副本...而不是对象)因此,将在32位计算机上分配四个字节来保存副本.

除了传递相同的引用(没有引用副本)之外,使用ref关键字对性能影响不大.它具有以下好处

  • 仅清除采用参数的方法可能修改它的意图,并且调用者可以在执行后获得修改后的值.
  • 并且变量必须由被调用者初始化,然后作为参数传递给带有ref参数的被调用函数.


Gra*_*ers 7

'ref'不会将对象本身传递给函数,而是传递对存储在/ at中的变量的引用.

如果对象是类或接口,那么无论何时在函数中访问该变量,都必须取消引用它,然后访问该变量.如果在没有'ref'关键字的情况下传入它,那么就不必进行解除引用步骤(因此它会稍快一些).

如果对象是结构(或枚举或其他基本类型),则'ref'关键字传递对存储结构的变量的引用,这仍然会导致在您使用它时解除引用的SLIGHT速度,但如果您不这样做t指定它,然后程序必须为结构的新实例分配内存,然后复制它.在大多数情况下,通过ref关键字传递结构更快,但如果它是一个非常小的结构,或者它被解除引用很多(我的意思是很多),情况可能不是这样.

因此,如果你传递一个结构,那么ref通常是要走的路,否则就没有太大的区别(解除引用阶段的开销很小).

哦,实际上回答这个问题,Bitmap是一个类,所以'ref'关键字与non-'ref'参数的速度差别不大.