2009-05-23 9 views
11

Wenn Sie ein Bitmap-Objekt haben, das an zahlreiche Methoden übergeben werden muss (etwa 10) und schließlich an ein Ereignis, an dem es nach seiner Verwendung endgültig verworfen werden soll, wäre es (Leistung weise) nützlich, um es durch Referenz anstelle von Wert auf jede dieser Methoden zu übertragen?C# 'ref' Schlüsselwort, Leistung

Überschreiten nach Wert, das Objekt wird kopiert, übergeben als Referenz nicht.

(Performance ist in dieser Situation entscheidend. Die Anwendung muss so schnell wie möglich auszuführen.)

+0

vb.net: [which-ist-schneller-byval-or-byref] (http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref) – nawfal

+0

Es gibt jetzt Weg Wie wäre es möglich, eine Bitmap nach Wert zu übergeben? – IllidanS4

Antwort

30

Bitmap ist ein Referenztyp. Wenn Sie einen Referenztyp nach Wert übergeben, wird das Objekt nicht kopiert, sondern lediglich der Verweis auf das Objekt. Es würde keinen Leistungsvorteil geben, die Bitmap nach Referenz anstatt nach Wert zu übergeben.

7

Welche Art sind Sie genau die Bitmap zum Halten? Beispielsweise ist System.Drawing.Bitmap ein Referenztyp/eine Referenzklasse. Wenn Sie einen Verweis auf eine Methode (als Argument) übergeben, wird die Referenz als Wert übergeben. (Eine Kopie der Referenz wird gemacht ... nicht das Objekt) Also vier Bytes würden auf einer 32-Bit-Maschine zugeordnet werden, um die Kopie zu halten.

Die Verwendung des Schlüsselworts ref hat nicht viel Einfluss auf die Leistung, außer dass dieselbe Referenz übergeben wird (eine Kopie der Referenz wird nicht erstellt). Es hat die folgenden Vorteile

  • Nur die Absicht klärt, dass die Methode die Parameter unter es ändern kann, und der Anrufer kann eine modifizierten Wert nach der Ausführung erhalten.
  • Und die Variable muss vom Aufrufer initialisiert werden, bevor sie als Argument an die aufgerufene Funktion übergeben wird, die den Parameter ref übernimmt.
+0

Danke für die zusätzlichen Details! –

+0

"Mit dem Schlüsselwort ref ... wird nur die Absicht gelöscht". Ähm, ich glaube nicht, dass das stimmt. Ein Verweis auf eine übergebene Verweisadresse (Objekt **) kann vom Aufrufer erneut zugewiesen werden; Einfluss darauf, auf welches Objekt die Anruferreferenz zeigt. Das Übergeben eines Verweis-by-value (object *) übergibt eine Kopie der Referenz und isoliert die callers-reference von Änderungen innerhalb der calle. Dieser Artikel http://preview.tinyurl.com/oda4jz hat ein Beispiel in C#. – corlettk

+0

Korrigieren. Daher zwingt die Methode, die einen ref-Parameter verwendet, die Aufrufer, ref explizit vor dem Argument zu schreiben - um sicherzustellen, dass die Anrufer die Semantik verstehen und ihr zustimmen. Es verdeutlicht die Absicht, dass der Aufrufer ein Argument vollständig übermittelt, dass das Argument nach dem Methodenaufruf einen anderen Wert/Status haben kann. – Gishu

15

Da Bitmap ein Referenztyp ist, gibt es keinen praktischen Unterschied für die Leistung in diesem Szenario, da es bereits durch Verweis auf die Methode übergeben wird.

Ich würde empfehlen, Jon Skeet's article on the subject für eine gründliche Erklärung, wie "nach Referenz" und "nach Wert" in C# arbeiten.

+0

Danke für den Link zu dem Artikel, hat mir wirklich geholfen. Schätzen Sie es Knospe –

+0

Schöne Artikelempfehlung. Es ist ein großartiger Lesevorgang, um Werte/Referenztypen und Parameter, die nach Wert/Referenz übergeben werden, gründlich zu verstehen. –

5

Das 'ref' übergibt das Objekt selbst nicht an die Funktion, sondern übergibt einen Verweis auf die Variable, in der es gespeichert ist.

Wenn das Objekt eine Klasse oder eine Schnittstelle ist, muss es immer dann, wenn Sie auf diese Variable in der Funktion zugreifen, es dereferenzieren und dann auf die Variable zugreifen. Wenn es ohne das Schlüsselwort 'Ref' übergeben würde, müsste es den Dereferenzierungsschritt nicht ausführen (daher wird es etwas schneller).

Wenn das Objekt eine Struktur (oder eine Enumeration oder ein anderer Basistyp) ist, übergibt das ref-Schlüsselwort einen Verweis auf die Variable, die die Struktur speichert, die immer noch die SLIGHT-Geschwindigkeit der Dereferenzierung verursacht, wenn Sie es verwenden Wenn Sie es nicht angeben, muss das Programm Speicher für eine neue Instanz der Struktur zuweisen und dann kopieren. In den meisten Fällen ist es schneller, Strukturen über das ref-Schlüsselwort zu übergeben, aber dies ist möglicherweise nicht der Fall, wenn es sich um eine wirklich kleine Struktur handelt oder wenn es stark dereferenziert ist (und ich meine eine LOT).

Also, wenn Sie eine Struktur übergeben, dann ref ist in der Regel der Weg zu gehen, sonst wird es nicht wirklich einen großen Unterschied (der Overhead in der Dereferenzierungsphase ist winzig).

Oh, und um die Frage tatsächlich zu beantworten, ist eine Bitmap eine Klasse, also wird das 'Ref' Schlüsselwort nicht wirklich einen Geschwindigkeitsunterschied gegenüber einem Nicht-Arf 'Parameter machen.

+0

+1 für den Hinweis auf den Vorteil des Verweises für Strukturen und eine ausführlichere Erläuterung der Auswirkungen der Dereferenzierung auf die Leistung. – Didaxis