如果你有一个Bitmap对象需要传递给众多方法(大约10个),最后到一个事件,它将在它被使用后最终被处理掉,是否(性能明智)将它传递给这些方法中的每一个都是通过引用而不是值?
按值传递,对象被复制,而不是通过引用传递。
(在这种情况下,性能至关重要。应用程序需要尽可能快地运行。)
答案 0 :(得分:31)
位图是一种引用类型。按值传递引用类型不会复制对象,只会复制对象的引用。通过引用而不是按值传递Bitmap没有性能优势。
答案 1 :(得分:17)
由于Bitmap是一种引用类型,因此在这种情况下性能没有实际差异,因为它已经通过引用方法传递。
我建议Jon Skeet's article on the subject详细解释“按引用”和“按价值”如何在C#中工作。
答案 2 :(得分:9)
您使用哪种类型来保存位图?例如,System.Drawing.Bitmap是引用类型/类。传递对方法的引用(作为参数)时,引用将按值传递。 (引用的副本...而不是对象)因此,将在32位计算机上分配四个字节来保存副本。
使用ref关键字对性能影响不大,除了传递相同的引用(不引用引用的副本)。它有以下好处
答案 3 :(得分:7)
'ref'不会将对象本身传递给函数,而是传递对存储在/ at中的变量的引用。
如果对象是类或接口,那么无论何时访问函数中的该变量,都必须取消引用它,然后访问该变量。如果它是在没有'ref'关键字的情况下传入的,那么它就不必进行解除引用步骤(因此它会稍快一点)。
如果对象是结构(或枚举或其他基本类型),则'ref'关键字传递对存储结构的变量的引用,这仍然会导致在您使用它时解除引用的SLIGHT速度,但是你没有指定它,那么程序必须为结构的新实例分配内存然后复制它。在大多数情况下,通过ref关键字传递结构更快,但如果它是一个非常小的结构,或者它被解除引用很多(我的意思是很多),情况可能不是这样。
因此,如果你传递一个结构,那么ref通常是要走的路,否则就没有太大的区别(解除引用阶段的开销很小)。
哦,实际上回答这个问题,Bitmap是一个类,所以'ref'关键字与non-'ref'参数的速度差别不大。