2009-08-15 18 views
0

Angenommen, ich habe die folgenden Code-Schnipsel, d. H. Goo Anruf Foo, DataTable von Goo und Foo erstellt wird nur Rows.Add aufrufen. Dann verwendet goo die aktualisierten Daten der DataTable-Instanz von foo.C# Übergabe Ref-Typ Parameter Problem

Meine Frage ist, in meinem Szenario, irgendwelche Unterschiede oder Vorteile verglichen mit der Verwendung mit und ohne Ref-Parameter?

Ich benutze C# +. Net 3.5 + VSTS2008.

void foo (ref DataTable dt) 
    { 
     // call Row.Add on dt 
    } 

    void goo() 
    { 
     DataTable dt1 = ...; // create a new instance of DataTable here 
     foo (ref dt1); 
     // read updated content of DataTable by foo here 
    } 
+0

Wie hoch sind die Chancen, dass Sie eine Antwort auf diese Frage tatsächlich akzeptieren? – womp

Antwort

4

Sie verwenden nur ref, wenn Sie ändern möchten, was dt Punkte auf. ZB wenn Sie es mit einem anderenDataTable (oder einem Typ, der von DataTable abgeleitet wird) ersetzen wollten.

In diesem Fall sind Sie nur mitdt, so gibt es keinen Grund, ref zu verwenden. Da DataTable eine Klasse ist, sind alle vorgenommenen Änderungen bis außerhalb von foo sichtbar.

+0

Cool, Ihre Antwort ist sehr klar. – George2

0

Der einzige Unterschied/Vorteil, den ich sehe, ist, dass der Code klarer wäre, wenn Sie ihn nicht als Referenz übergeben würden.

+0

Danke! 1. Funktionsseitig haben sie in meinem Szenario die gleiche Funktion? 2. Warum denkst du, dass die Verwendung von ref nicht klarer ist? – George2

+1

Die anderen Antworten haben weiter erklärt warum. Sie sollten nur als Referenz verwenden, wenn Sie müssen und in diesem Fall nicht. :) – klabranche

+0

Danke, klabranche! – George2

2

In diesem Fall besteht absolut kein Unterschied zwischen der Verwendung eines ref- oder eines non-ref-Parameters. Das einzige, was ein ref-Parameter in dieser Situation tun kann, ist "dt = new DataTable()" und hat Auswirkungen auf die Hauptfunktion.

Es ist besser, nur einen Ref-Parameter zu verwenden, wenn Sie es benötigen, andernfalls erzeugt es einen unordentlicheren Code.

+0

"Das einzige, was ein Ref-Parameter in dieser Situation zulässt, ist" dt = new DataTable() "und hat Auswirkungen auf die Hauptfunktion." - Ich verstehe nicht, was meinst du mit "erlauben Sie es zu tun" und "beeinflussen die Hauptfunktion". Weitere Beschreibungen? – George2

+0

Ok, also: Wenn Sie einen Parameter übergeben, tut es 1 von 2 Dinge, es übergibt den tatsächlichen Wert (eine Kopie) des Parameters (non-ref), oder es übergibt einen Zeiger auf die Variable. In einem primitiven Typ (int, float, etc.), macht es einen großen Unterschied, weil die Änderung des ref-Parameters in einer Funktion auch den Wert im Aufrufer ändert. – Erich

+0

Bei Objekttypen verwenden Sie bereits einen Zeiger, sodass alle Werte in einer nicht ref-ref-Kontextzahl geändert werden. Da Sie jedoch eine Kopie des Zeigers (nicht die gleiche) haben, wirkt sich die Neuzuweisung nicht auf die aufrufende Funktion aus.Mit dem Ref-Parameter ändert eine Zuweisung den Wert in der aufrufenden Funktion. In diesem Fall, wenn Foo dt = new DataTable(), wäre der Wert von dt1 in Goo die neue Datentabelle. Ohne den Verweis ist dies nicht der Fall. – Erich

3

Sie benötigen den Parameter ref nicht, es sei denn, Sie möchten ein anderes Objekt zurückerhalten. Die DataTable ist ein Referenzobjekt, also übergeben Sie einen Zeiger auf einen Zeiger. Wenn Sie nur möchten, dass die aufgerufene Funktion Änderungen an Ihrer Instanz vornimmt, benötigen Sie keine Referenz.

+1

Cool, Ihre Antwort ist sehr klar. – George2

0

Andere haben bereits geantwortet, aber wenn Sie mehr Informationen möchten, können Sie meine article on parameter passing in C# lesen.

(Jeder hat Recht - wenn Sie nur die Daten im Objekt ändern möchten, können Sie das Argument nach Wert übergeben. Wenn Sie ändern möchten, welches Objekt die Variable des Aufrufers bezieht, dann Sie vorbei Referenz.)

+0

@Jon, "Wenn Sie nur die Daten im Objekt ändern möchten, können Sie das Argument ** durch Referenz ** übergeben" "Sollte das nicht nach Wert sein"? – Ash

+0

Ups, danke, behoben :) –

Verwandte Themen