2017-12-22 8 views
2

Von C Programmiersprache, soweit ich mich erinnere, wenn ein Zeiger auf einen anderen Zeiger zugewiesen ist, würden wir verwenden ** Präfix für den Zugriff auf den ursprünglichen Wert.Verarbeitet der C# -Compiler Referenzen von Referenzen während der Kompilierung?

Wie funktioniert das, wenn ich eine Objektinstanz an eine Methode wie ref Myobject myObject Argument übergeben. Setzt C# die Heap-Adresse des Objekts auf und ruft printSomething in folgendem Code auf?

Wenn also eine rekursive Funktion wäre, würde der Compiler den Referenzadressen folgen, bis er das Objekt findet?

Ich füge ein Testszenario hinzu;

public class Test 
{ 


    public Test() 
    { 
     StringBuilder str = new StringBuilder(); 
     Function(ref str); 
     Console.WriteLine(str.ToString()); 
    } 

    int referenceCount = 0; 

    int Function(ref StringBuilder sBuilder) 
    { 
     referenceCount++; 

     if (referenceCount == 100) 
     { 
      sBuilder.Append("foo"); 
      return referenceCount; 
     } 

     Function(ref sBuilder); 
     return referenceCount; 
    } 

    public static void Main(string[] args) 
    { 
     new Test(); 
     Console.ReadLine(); 
    } 

} 

Wenn ich entfernen, wenn Block als Stapel über Fluss Ausnahme erwartet gibt so für jedes Verfahren eine neue Referenz in stack.After reserviert nennen Verknüpfung 100 von ihnen miteinander ich eine Methode auf dem letzten nenne. Wird sBuilder.Append("foo"); Code den verknüpften Referenzen folgen, bis es das Objekt erreicht?

+0

Der Zeiger ist die Startadresse eines Objekts. Die Struktur des Objekts muss in C# und c identisch definiert sein. Da C# verwaltet wird, muss das Objekt mithilfe einer Marshal-Technik in nicht verwalteten Speicher verschoben werden. Die Verwendung von zwei Sternchen kann bedeuten, dass der Zeiger eine Adresse für eine Adresse einer Adresse in einem Array ist. Die Kompilierung macht nichts, Sie müssen alle richtigen Definitionen machen. Die Kompilierung legt nur die Startadresse des Objekts auf den Stapel. – jdweng

+1

Da Sie 'myObject' in Ihrem Beispiel nicht neu zuweisen, ist das' ref'-Schlüsselwort völlig nutzlos. Natürlich wird 'printSomething' für die bereitgestellte Instanz aufgerufen. Ich kann keinen anderen sehen. Ich verstehe nicht, was du fragst. – HimBromBeere

+0

Ich fügte ein Testszenario hinzu, um die Dinge etwas zu verdeutlichen. Ich hoffe ich habe mich klarer gemacht. – trueLife

Antwort

0

Betrachten Sie diese article.

Ref in C# ist kein Zeiger in C++. Das sind andere Konzepte.

Bei Verwendung in der Parameterliste einer Methode gibt das Schlüsselwort ref an, dass ein Argument als Referenz übergeben wird, nicht als Wert. Der Effekt von , der als Referenz übergeben wird, ist, dass jede Änderung des Arguments in der aufgerufenen -Methode in der aufrufenden Methode widergespiegelt wird. Wenn beispielsweise der Anrufer eine lokale Variable Ausdruck gibt oder ein Array-Element Zugriffs Expression und die genannte Methode ersetzt das Objekt, dem der Schiedsrichter Parameter bezieht sich bezieht, dann des Anrufers lokale Variable oder das Array Element nun auf den neuen Objekt, wenn die Methode zurückgibt.