2009-05-23 67 views
11

如果您有一个Bitmap对象需要传递给多个方法(大约10个),并最终传递到一个事件,最终在它被使用之后处理掉,它会是明智的)是否有利于通过引用而不是价值将它传递给每一种方法?C#'ref'关键字,性能

通过值传递,对象被复制,通过引用传递它不。

(表现在这种情况下是至关重要的。该应用程序需要尽可能快。运行)

+0

vb.net:[which-is-is-faster-byval-or-byref](http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref) – nawfal 2013-12-15 20:20:28

+0

现在有办法如何能够通过值传递一个位图。 – IllidanS4 2015-01-09 13:05:39

回答

30

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

7

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

使用ref关键字对性能影响不大,只是传递了相同的引用(未提供引用的副本)。它具有以下优点

  • ,仅清除意图,服用参数该方法可以修改它,调用者可以得到一个修正值后执行。
  • 变量必须由被调用方初始化,然后才能作为参数传递给采用ref参数的被调用函数。
+0

感谢您的额外细节芽! – 2009-05-23 05:37:53

+0

“使用ref关键字...仅清除意图”。嗯,我不认为这是真的。调用者可以重新分配引用传递的参数(对象**)影响调用者参考指向哪个对象。按值传递引用(object *)传递引用的副本,将调用者引用与calle中的更改隔离。本文http://preview.tinyurl.com/oda4jz在C#中有一个例子。 – corlettk 2009-05-23 06:20:26

15

由于Bitmap是引用类型,因此在此方案中的性能没有实际差异,因为它已通过对该方法的引用传递。

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

5

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

如果对象是类或接口,那么无论何时访问该函数中的变量,都必须对其进行解引用,然后访问该变量。如果它是在没有'ref'关键字的情况下传递的,那么它不必执行取消引用步骤(因此它会稍微快一点)。如果对象是一个结构体(或枚举或其他基类型),'ref'关键字将一个引用传递给存储该结构体的变量,但每当您使用该引用时仍会导致解引用的SLIGHT速度命中,但如果你没有指定它,那么程序必须为结构的新实例分配内存然后复制它。在大多数情况下,通过ref关键字传递结构会更快,但如果它是一个非常小的结构体,或者它被很多解除引用(我的意思是LOT),情况可能并非如此。因此,如果你传递一个结构体,那么ref通常是要走的路,否则不会有太大的区别(在解引用阶段的开销很小)。

哦,为了真正回答这个问题,Bitmap是一个类,所以'ref'关键字不会真正在非-farf参数上产生速度差异。