<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.aspnetzone.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tag 'Wertetypen'</title><link>http://www.aspnetzone.de/search/SearchResults.aspx?o=DateDescending&amp;tag=Wertetypen&amp;orTags=0</link><description>Search results matching tag 'Wertetypen'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>Parameter&amp;amp;#252;bergabe in C# bei Referenztypen</title><link>http://www.aspnetzone.de/photos/peterbucher/images/175685/original.aspx</link><pubDate>Mon, 12 Feb 2007 23:36:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:175685</guid><dc:creator>Peter Bucher</dc:creator><description /></item><item><title>Artikel: Parameter&amp;#252;bergabe in C# (by value, by reference und out)</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2007/02/12/c-parameter-bergabe-default-by-value-by-reference-und-out.aspx</link><pubDate>Mon, 12 Feb 2007 18:47:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:175680</guid><dc:creator>Peter Bucher</dc:creator><description>&lt;P&gt;&lt;FONT size=4&gt;&lt;IMG border=0 align=right src="http://www.aspnetzone.de/photos/peterbucher/images/175685/secondarythumb.aspx"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;&lt;FONT size=4&gt;Einleitung&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;STRONG&gt;Über diesen Artikel&lt;/STRONG&gt;:&lt;BR&gt;Ich wollte genau wissen, wie die Parameterübergabe in C# funktioniert. So&amp;nbsp;bin im Netz auf die Suche gegangen und habe Tests gemacht.&lt;BR&gt;Im &lt;A href="http://www.mycsharp.de/wbb2/thread.php?threadid=12251"&gt;Artikel&lt;/A&gt; von myCSharp wurde das Vorgehen und Verhalten gut erklärt, aber bei mir hat es dann immer noch nicht ganz "Klick" gemacht. Knifflig fand ich vor allem, wie die standardmässige Übergabe ohne irgendein Schlüsselwort funktioniert.&lt;/P&gt;
&lt;P&gt;Zum Thema Paramterübergabe habe ich nirgends einen Artikel gefunden, der leicht zu verstehen ist und alles übersichtlich darstellt.&lt;BR&gt;Nach dem Zusammensuchen von verschiedensten Informationen versuche ich nun, die gewonnene Einsicht auch für Anfänger verständlich zu erklären. Ich hoffe, dass mir dies gelungen ist und dass euch dieser Artikel gefällt.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Grundlagen zum Artikel&lt;/STRONG&gt;:&lt;BR&gt;- &lt;A href="http://www.galileocomputing.de/openbook/visual_csharp/visual_csharp_05_005.htm#Xxxobkap05005040017da1f021186"&gt;Wertetypen / Referenztypen / Stack / Heap&lt;/A&gt;&lt;/P&gt;&lt;STRONG&gt;Worterklärungen&lt;/STRONG&gt;:&lt;BR&gt;Scope: Anderes Wort für "Bereich" im besonderen Fall "Gültigkeitsbereich".&lt;BR&gt;&lt;A href="http://de.wikipedia.org/wiki/Referenz_(Programmierung)"&gt;Referenz&lt;/A&gt;: Adresse der Speicherstelle,&amp;nbsp;wo der&amp;nbsp;Wert einer Variable&amp;nbsp;gespeichert ist.&lt;BR&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;FONT color=#808080&gt;Artikel&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;STRONG&gt;Parameterübergabe&lt;/STRONG&gt;:&lt;BR&gt;Als Parameterübergabe wird der Vorgang bezeichnet, Daten an eine Methode weiterzureichen um diese in einer Methode zur Verfügung zu haben.&lt;BR&gt;Entweder benutzt man diese Daten, um damit zu zu arbeiten und einen daraus folgenden Wert per "return" zurückzugeben oder auch um innerhalb der Methode ein Objekt zu benutzen, z.B. eine Node in einem TreeView einzufügen.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Parameter / Argumente&lt;/STRONG&gt;:&lt;BR&gt;Als Parameter wird der Weg bezeichnet, der im Methodenaufruf übergeben wird.&lt;BR&gt;Die Werte, die in der Methode entgegengenommen werden, sind&amp;nbsp;Argumente.&lt;BR&gt;&lt;STRONG&gt;&lt;BR&gt;Übergabearten&lt;/STRONG&gt;:&lt;BR&gt;In C# gibt es&amp;nbsp;drei verschiedene Möglichkeiten, um eine, bzw. mehrere&amp;nbsp;Variablen zu übergeben.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Standardmässig wird vor dem Parameter kein Schlüsselwort angegeben. Dies&amp;nbsp;ist eine&amp;nbsp;Übergabe als Wert&amp;nbsp;(by value):&lt;BR&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Aufruf der Methode mit Parameterübergabe (by value)&lt;/span&gt;&lt;br /&gt;MeineMethode(meinParameter);&lt;/span&gt;&lt;/code&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;Übergabe als Referenz (by reference):&lt;BR&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Aufruf der Methode mit Parameterübergabe (by reference)&lt;/span&gt;&lt;br /&gt;MeineMethode(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ref&lt;/span&gt; meineVariable);&lt;/span&gt;&lt;/code&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;Übergabe als Ergebnisparameter:&lt;BR&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Aufruf der Methode mit Ergebnisparameterübergabe (Schlüsselwort: out)&lt;/span&gt;&lt;br /&gt;MeineMethode(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;out&lt;/span&gt; meinErgebnisParameter);&lt;/span&gt;&lt;/code&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;&lt;BR&gt;&lt;BR&gt;
&lt;DIV class=HinweisBox&gt;&lt;STRONG&gt;Hinweis&lt;/STRONG&gt;:&lt;BR&gt;Die Schlüsselwörter "ref" und "out" müssen bei der Methodendefinition sowie auch beim Methodenaufruf deklariert werden.&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Viele von euch werden vor allem von der ersten Übergabeart Gebrauch gemacht haben.&lt;BR&gt;Ihr werdet euch jetzt evt. denken "Sieht doch alles praktisch gleich aus, wo liegt da der Unterschied?"&lt;BR&gt;Es sieht wirklich fast gleich aus, die Unterschiede sind aber enorm und es ist gut sich über die Hintergründe zu informieren.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Verhalten bei Wertetypen&lt;/STRONG&gt;:&lt;BR&gt;Bei Wertetypen wird der Parameter im Normalfall, also ohne ein zusätzliches Schlüsselwort als Kopie des Wertes übergeben.&lt;BR&gt;Mit dem Schlüsselwort "ref" vor dem Parameter wird die Referenz auf die Variable übergeben.&lt;BR&gt;Das Argument kann anschliessend in der Methode verändert werden und&amp;nbsp; die Änderung wirken sich auch auf die ursprüngliche Variable in der höheren Ebene (Scope) aus.&lt;BR&gt;Wird hingegen das Schlüsselwort "out" verwendet, passiert das gleiche wie beim "ref" Schlüsselwort, mit dem Unterschied dass der übergebenen Variable beim Prozeduraufruf noch kein Wert zugewiesen werden muss, diese also noch nicht initialisiert sein muss.&lt;BR&gt;&lt;BR&gt;Die Übergabe mit dem Schlüsselwort "out" wird verwendet, um mehrere Methodenergebnisse zurückzugeben, was anders nicht möglich bzw. nur mit Umwegen über eine Datenhaltungsklasse / -Struktur möglich wäre. Die übergebene Variable muss in diesem Fall nicht initialisiert werden.&lt;BR&gt;Das Argument ist,&amp;nbsp;wie bei der Übergabe per Referenz, eine Referenz auf den Wert.&lt;BR&gt;Viele Funktionen der &lt;A href="http://de.wikipedia.org/wiki/WinAPI"&gt;WinAPI&lt;/A&gt; machen z.B.&amp;nbsp;von dieser&amp;nbsp;Übergabeart Gebrauch.&lt;BR&gt;&lt;BR&gt;Übergabe als Wert (by value)&lt;BR&gt;&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Variable deklarieren und initialisieren:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; meineVariable &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; 1; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Aufruf unserer Methode und Ausgabe unserer Variable in der Konsole&lt;/span&gt;&lt;br /&gt;meineMethode(meineVariable);&lt;br /&gt;Console.WriteLine(meineVariable.ToString()); &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Gibt 1 aus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Deklarierung unserer Methode und Gebrauch des Arguments&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; MeineMethode(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; meinArgument) {&lt;br /&gt;   &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Wir weisen unserem Argument einen neuen Wert zu.&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Diese Änderung ist nur innerhalb unserer Methode gültig und hat keine Auswirkungen auf unsere ursprüngliche Variable&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// da nur eine Kopie des Wertes übergeben wird, die ausser dem gleichen Wert nichts mit unserer ursprünglichen Variable zu tun hat!&lt;/span&gt;&lt;br /&gt;  meinArgument &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; 4;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Übergabe als Referenz (by reference)&lt;BR&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Variable deklarieren und initialisieren:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; meineVariable &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; 1; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Aufruf unserer Methode und anschliessende Ausgabe unserer Variable in der Konsole meineMethode(ref meineVariable);&lt;/span&gt;&lt;br /&gt;MeineMethode(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ref&lt;/span&gt; meineVariable);&lt;br /&gt;Console.WriteLine(meineVariable.ToString()); &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Gibt 4 aus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Deklarierung unserer Methode und Veränderung des Arguments&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; MeineMethode(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ref&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; meinArgument) {&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Wir weisen unserem Argument den Wert 4 zu. Da per "ref" Schlüsselwort die Referenz (Zeiger) auf unsere Variable "meineVariable" übergeben wird,&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// ändert sich auch der Wert unserer Variable.&lt;/span&gt;&lt;br /&gt;  meinArgument &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; 4;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Übergabe mit Ergebnisparameter (Schlüsselwort: out)&lt;BR&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Deklarierung, jedoch keine Initialisierung unserer Ergebnisparameter&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; meinName;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; meinAlter; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Aufruf unserer Methode&lt;/span&gt;&lt;br /&gt;MeineMethode(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;out&lt;/span&gt; meinName, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;out&lt;/span&gt; meinAlter);&lt;br /&gt;Console.WriteLine(meinName); &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Gibt Peter aus&lt;/span&gt;&lt;br /&gt;Console.WriteLine(meinAlter); &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Gibt 23 aus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Deklarierung unserer Methode und Zuweisung der gewünschten Werte&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; MeineMethode(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;out&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; meinNameArgument, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;out&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; meinAlterArgument) {&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Zuweisen der Werte an unsere Argumente&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Wir weisen unseren Argumenten jeweils einen Wert zu. Unsere Variablen, die wir vorher definiert haben, übernehmen diesen Wert,&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// da die Referenz übergeben worden ist&lt;/span&gt;&lt;br /&gt;  meinNameArgument= &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Peter"&lt;/span&gt;;&lt;br /&gt;  meinAlterArgument &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; 23;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=4&gt;&lt;BR&gt;Zusammenfassung&lt;/FONT&gt;:&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Übergabe als Wert (by value) "ohne Schlüsselwort"&lt;/STRONG&gt;:&lt;BR&gt;- Kopie des Wertes wird übergeben&lt;BR&gt;- Keine Auswirkungen auf den Ursprünglichen Wert unserer Variable&lt;BR&gt;- Wird am häufigsten benutzt, nämlich dann, wenn die Argumente von der Methode nicht verändert werden, oder um mit einem Objekt zu arbeiten, ohne die Referenz zu überschreiben (siehe unten).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Übergabe als Referenz (by reference) "ref"&lt;/STRONG&gt;:&lt;BR&gt;- Referenz auf Variable wird übergeben&lt;BR&gt;- Ursprüngliche Variable ändert sich, wenn wir das Argument in der Methode ändern&lt;BR&gt;- Die Referenz unserer Variable und unseres Arguments zeigen auf den gleichen Wert.&lt;BR&gt;- Wird für Argumente gebraucht, die von der aufgerufenen Methode verändert werden sollen.&lt;BR&gt;- Übergabe als Referenz ist schneller, da hier die Daten an sich nicht kopiert werden müssen, sondern nur die Referenz.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Übergabe als Ergebnisparameter "out"&lt;/STRONG&gt;:&lt;BR&gt;- Alle genannten Punkte bei "Übergabe als Referenz" stimmen auch hier&lt;BR&gt;- Übergebene Variable muss nicht initialisiert sein&lt;BR&gt;- Gebrauch als Ergebnisparameter&lt;/P&gt;
&lt;P&gt;Eine Methode kann nur einen Rückgabetyp und einen Rückgabewert haben.&lt;BR&gt;Mit Hilfe der Ergebnisparameter können wir, wie im Beispiel oben gezeigt,&amp;nbsp; mehrere Werte verschiedener Typen auf einen Schlag zurückgeben. &lt;/P&gt;
&lt;P&gt;Es gibt natürlich, wie meistens :), noch andere Wege um mehrere Werte zurückzugeben. Man kann sich z.B. eine Struktur "Schlüsselwort: struct" oder eine Datenhaltungsklasse mit mehreren Feldern unterschiedlicher oder gleicher Typen definieren und diese/s dann als Rückgabetyp angeben.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Verhalten bei Referenztypen&lt;/STRONG&gt;:&lt;BR&gt;Bei den Referenztypen ist das Verhalten bei der Übergabe von Parameter kniffliger.&lt;BR&gt;Wenn dieses nicht bekannt ist, kann es leicht zu logischen Fehlern im Programm kommen.&lt;BR&gt;Das Verhalten bei der Übergabe als Referenz ist gleich wie bei den Wertetypen, es wird also die Referenz übergeben und es gilt das gleiche wie oben beschrieben. Man kann einem Referenztyp,&amp;nbsp;der mithilfe von "ref" übergeben wird, auch ein vollkommen neues Objekt zuweisen.&lt;BR&gt;Nach dieser Zuweisung zeigt die Referenz im Ursprungsscope dann auch auf das neue Objekt.&lt;BR&gt;Bei der Benutzung vom Schlüsselwort "out" gilt dasselbe.&lt;BR&gt;&lt;BR&gt;Bei der standardmässigen Übergabe eines Referenztypes an eine Methode müssen wir beachten, dass eine&lt;FONT color=#000000&gt;&lt;STRONG&gt; Kopie der Referenz&lt;/STRONG&gt;&lt;/FONT&gt; auf unser Objekt übergeben wird.&lt;BR&gt;Mit dem Objekt können wir noch genau gleich arbeiten wie auch im Ursprungsscope und den Eigenschaften Werte zuweisen.&lt;BR&gt;Das normal erwartete Verhalten also.&lt;BR&gt;&lt;BR&gt;Der Haken an der Geschichte ist aber folgender:&lt;BR&gt;Wenn wir unserem Argument innerhalb der Methode ein anderes Objekt zuweisen, zeigt zwar die Kopie der Referenz auf das neue Objekt, jedoch nicht die ursprüngliche Referenz. Wir verlieren beim Verlassen der Methode die Referenz auf unser soeben zugewiesenes Objekt. &lt;BR&gt;Denn diese Kopie der Referenz ist nur &lt;FONT color=#000000&gt;&lt;STRONG&gt;temporär innerhalb der Methode&lt;/STRONG&gt;&lt;/FONT&gt; zugänglich.&lt;/P&gt;
&lt;P&gt;Es wird also damit die ursprüngliche, originale Referenz vom Überschreiben &lt;STRONG&gt;geschützt&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Der Clou ist also: Wenn wir innerhalb der Methode ein neues Objekt zuweisen wollen, müssen wir die Referenz per Referenz "ref" oder out an die Methode übergeben. Alles klar?&lt;/P&gt;
&lt;P&gt;Nicht?&lt;BR&gt;Okay, ein kleines Konsolenprogramm als Beispiel wie man es &lt;U&gt;&lt;STRONG&gt;nicht&lt;/STRONG&gt;&lt;/U&gt; machen soll, in diesem Fall sollte man das Schlüsselwort "ref" benutzen:&lt;BR&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;using&lt;/span&gt; System; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;namespace&lt;/span&gt; ParameteruebergabeInCSharp {&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; Program {&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Main(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;[] args) {&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Wir erstellen unser Objekt und füllen die Eigenschaft "Name"&lt;/span&gt;&lt;br /&gt;            Mensch m &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Mensch();&lt;br /&gt;            m.Name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Peter"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Wir rufen unsere Funktion auf und übergeben unser Mensch Objekt&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// an die Methode&lt;/span&gt;&lt;br /&gt;            Foo(m);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Hier wird "Peter" ausgegeben&lt;/span&gt;&lt;br /&gt;            Console.WriteLine(m.Name);&lt;br /&gt;&lt;br /&gt;            Console.Read();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Foo(Mensch MenschArgument) {&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/*&lt;br /&gt;             das Argument "MenschArgument" ist jetzt eine Kopie der Referenz&lt;br /&gt;             auf unser Mensch Objekt "m"&lt;br /&gt;             Jetzt weisen wir / referenzieren wir auf ein neues Mensch Objekt&lt;br /&gt;             Und weisen ihm einen neuen Wert zu.&lt;br /&gt;             &lt;br /&gt;             Folgendes passiert:&lt;br /&gt;             Beim referenzieren zeigt die Referenz des "MenschArgument" jetzt auf unser&lt;br /&gt;             soeben neu erstelltes "Mensch"-Objekt.&lt;br /&gt;             Dieses Referenz ist aber nur bis zum Ende der Methode gültig und genau&lt;br /&gt;             das ist jetzt unser Problem.&lt;br /&gt;             Wir verlieren die Referenz und den Wert.&lt;br /&gt;            */&lt;/span&gt;&lt;br /&gt;            MenschArgument &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Mensch(); &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// &amp;lt;-- neues Objekt zuweisen, referenzieren&lt;/span&gt;&lt;br /&gt;            MenschArgument.Name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Stefan"&lt;/span&gt;; &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// &amp;lt;-- Wert zuweisen&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; Mensch {&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; _name;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Name {&lt;br /&gt;            get { &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;._name; }&lt;br /&gt;            set { &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;._name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; value; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;BR&gt;Die korrekte Anwendung wäre in diesem Fall:&lt;BR&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Foo(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ref&lt;/span&gt; m);&lt;/span&gt;&lt;/code&gt;&lt;BR&gt;&lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Foo(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ref&lt;/span&gt; Mensch MenschArgument) {&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;//...&lt;/span&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt; 
&lt;P&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Ich habe noch eine Bilderfolge erstellt, damit man sich besser vorstellen kann, was bei einer &lt;STRONG&gt;Parameterübergabe mit Referenztypen&lt;/STRONG&gt; genau passiert.&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://www.aspnetzone.de/photos/peterbucher/picture175685.aspx"&gt;&lt;IMG border=0 src="http://www.aspnetzone.de/photos/peterbucher/images/175685/original.aspx"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;STRONG&gt;Nachtrag&lt;/STRONG&gt;:&lt;BR&gt;Um sich besser&amp;nbsp;vorzustellen, was die ganze Geschichte&amp;nbsp;bei der "täglichen Übergabe" bedeutet, habe ich noch eine kleine Tabelle erstellt.&lt;BR&gt;Je nach Übergabeart der Parameter können diese in der Methode nur gelesen werden, gelesen und verändert werden oder nur verändert werden.&lt;BR&gt;Besonders interessant an der unteren Darstellung ist das Verhalten bei Referenztypen bei der Übergabeart "by value".&lt;/P&gt;
&lt;P align=left&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE class=datatable cellSpacing=1 cellPadding=2 align=center&gt;

&lt;TR&gt;
&lt;TH&gt;Übergabe von...&lt;/TH&gt;
&lt;TH&gt;...Wertetypen&lt;/TH&gt;
&lt;TH&gt;...Pointer (Referenz) auf Objekt&lt;/TH&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;by value&lt;/TD&gt;
&lt;TD&gt;Wert ist &lt;STRONG&gt;read-only&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;Referenz ist &lt;STRONG&gt;read-only&lt;/STRONG&gt;, das Objekt jedoch &lt;STRONG&gt;read-and-write&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;by reference&lt;/TD&gt;
&lt;TD&gt;Wert ist &lt;STRONG&gt;read-and-write&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;Referenz und Objekt sind &lt;STRONG&gt;read-and-write&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;out&lt;/TD&gt;
&lt;TD&gt;Wert ist &lt;STRONG&gt;write-only&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;Referenz und Objekt sind &lt;STRONG&gt;write-only&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Vielen Dank für alle, die bis jetzt durchgehalten haben ;-)&lt;BR&gt;Ich hoffe bei euch mit diesem Artikel evt. eine Wissenslücke ausgefüllt zu haben und &lt;STRONG&gt;freue mich über sämtliche Kommentare&lt;/STRONG&gt;.&lt;BR&gt;Natürlich nehme ich auch gerne konstruktive Kritik von euch an.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Weiterführende Links&lt;/STRONG&gt;:&lt;BR&gt;- &lt;A href="http://msdn2.microsoft.com/de-de/library/s6938f28(VS.80).aspx"&gt;Übergeben von Verweistypparametern (C#-Programmierhandbuch)&lt;/A&gt;&lt;BR&gt;- &lt;A href="http://msdn2.microsoft.com/de-de/library/szasx730(VS.80).aspx"&gt;Übergeben von Arrays mithilfe von "ref" und "out" (C#-Programmierhandbuch)&lt;/A&gt;&lt;BR&gt;- &lt;A href="http://msdn2.microsoft.com/de-de/library/14akc2c7(VS.80).aspx"&gt;http://msdn2.microsoft.com/de-de/library/14akc2c7(VS.80).aspx&lt;/A&gt;&amp;nbsp;(ref MSDN)&lt;BR&gt;- &lt;A href="http://msdn2.microsoft.com/de-de/library/t3c3bfhx(VS.80).aspx"&gt;http://msdn2.microsoft.com/de-de/library/t3c3bfhx(VS.80).aspx&lt;/A&gt;&amp;nbsp;(out MSDN)&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Quellen&lt;/STRONG&gt;:&lt;BR&gt;myCSharp.de: &lt;A href="http://www.mycsharp.de/wbb2/thread.php?threadid=12251"&gt;C# und Übergabemechanismen: call by value vs. call by reference (ref/out)&lt;/A&gt;&lt;BR&gt;Microsoft Newsgroups&lt;BR&gt;Internet generell&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Dank geht&amp;nbsp;an&lt;/STRONG&gt;:&lt;BR&gt;&lt;A href="http://blog.norberteder.com/"&gt;Norbert Eder&lt;/A&gt; für Bestätigungen meiner Nachforschungen&lt;BR&gt;Meine Schwester Susann für Ihre Ideen und Verbesserungsvorschläge&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Bearbeitung / Korrekturen&lt;/STRONG&gt;:&lt;BR&gt;13.02.07 - Rechtschreibefehler, Bild bearbeitet, Text korrigiert&lt;BR&gt;14.02.07 - Übergabetabelle und kurze Erklärung hinzugefügt&lt;/P&gt;</description></item></channel></rss>