C#'ref'关键字,性能

时间:2009-05-23 05:12:13

标签: c# performance ref

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

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

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

4 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分:17)

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

我建议Jon Skeet's article on the subject详细解释“按引用”和“按价值”如何在C#中工作。

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:7)

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

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

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

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

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