2009-05-23 68 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參數上產生速度差異。