13

如果您有一个 Bitmap 对象需要传递给许多方法(大约 10 个),最后传递给一个事件,在使用后最终将其处理掉,那么将它传递给每个方法(性能方面)是否有益?那些方法是引用而不是值?

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

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

4

4 回答 4

34

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

于 2009-05-23T05:21:06.957 回答
18

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

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

于 2009-05-23T05:28:42.157 回答
10

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

使用 ref 关键字对性能没有太大影响,只是传递了相同的引用(不复制引用)。它有以下好处

  • 只清除获取参数的方法可能修改它的意图,调用者可能会在执行后获得修改后的值。
  • 并且该变量必须由被调用者初始化,然后才能作为参数传递给采用 ref 参数的被调用函数。
于 2009-05-23T05:20:50.327 回答
8

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

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

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

因此,如果您要传递一个结构,那么 ref 通常是要走的路,否则不会有太大的区别(取消引用阶段的开销很小)。

哦,实际上要回答这个问题,Bitmap 是一个类,所以'ref' 关键字不会真正对非'ref' 参数产生速度差异。

于 2009-05-23T05:58:50.460 回答