2015-07-21 12 views
7

Ich lese Abschnitt 2.3.2 von Skeets Buch und nach meinem Verständnis gibt es keine echte Referenz in C#, wie es in C++ gibt.Lesen Sie Jon Skeets Kapitel über Referenzen versus Werte. Immer noch verwirrt

Es ist interessant, dass nicht nur zu beachten ist die „by reference“ wenig der Mythos innacurate, aber so ist das Bit „Objekte übergeben werden“. Objekte selbst sind nie übergeben, entweder als Referenz oder nach Wert. Wenn ein Referenztyp beteiligt ist, wird entweder die Variable durch den Verweis übergeben oder der Wert des Arguments (die Referenz) wird als Wert übergeben.

See, das ist etwas anderes als C++ (I aus einem C kommen ++ Hintergrund), weil in C++ Sie das Ampersand direkt ein Objekt in einer Parameterliste verwenden können, verwenden - keine Kopien von etwas, nicht einmal eine Kopie der Speicheradresse des Objekts:

bool isEven (int & i) { return i % 2 == 0 }) 

int main() 
{ 
    int x = 5; 
    std::cout << isEven(x); // is the exact same as if I had written 
          // std::cout (x % 2 == 0) 
    return 0; 
} 

Es gibt keine Entsprechung der oben genannten. Das Beste, was Sie in C# bekommen kann, ist ein Äquivalent

bool isEven (int * i) { return *i % 2 == 0 }) 

int main() 
{ 
    int x = 5; 
    std::cout << isEven(&x); // is like 
          // int * temp = &x; 
          // return *temp % 2 == 0; 
          // (garbage collect temp) 
    return 0; 
} 

, die im Wert von einer Art Referenz (ein Zeiger) und natürlich vergeht ist in meinem Beispiel sinnlos, weil alles, was in übergeben wird ist eine kleine primitiv (int).

Von dem, was ich verstehe, gibt es keine C# -Syntax, die ein Element ausdrücklich als eine Referenz, kein Äquivalent der & in meinem C++ - Beispiel bezeichnet. Der einzige Weg, um zu wissen, ob Sie mit einem Wert oder einer Referenz zu tun haben, ist, sich zu merken, welche Arten von Elementen Referenzen sind, wenn sie kopiert werden und welche Typen Werte sind. Es ist wie JavaScript in dieser Hinsicht.

Bitte kritisieren Sie mein Verständnis dieses Konzepts.

+1

Was mit den 'ref' Parametern falsch ist. Modifikator? Außerdem glaube ich nicht, dass C++ so funktioniert, wie Sie es für die Erklärung des ersten Snippets halten. Was du beschreibst, ist Inlining. – leppie

+0

@leppie Ich denke, ich habe noch nichts darüber gelernt. Hoppla. – user5124106

+0

@LarryPage "Memorizing, welche Arten von Elementen Referenzen sind" in .NET ist einfach, Klassen sind "Referenztypen" und Strukturen sind "Werttypen". Wenn Sie eine Variable übergeben, die eine Instanz einer Klasse ist, übergeben Sie vereinfacht gesagt einen Verweis auf diese Instanz einer Klasse. Wenn Sie eine Variable übergeben, die eine Instanz einer Struktur ist, übergeben Sie eine Kopie dieser Instanz. – jduncanator

Antwort

7

In C# sind alle Klassen Referenztypen und alles andere (glaube ich) nicht.

Es gibt zwei verschiedene Konzepte hier:
Referenztypen, wo eine „Referenz“ ist ein Wert, die zu einer Klasseninstanz bezieht, und
durch Bezugnahme vorbei, wo eine „Referenz“ ist etwas was sich auf eine Variable bezieht.

Das Wort "Verweis" bedeutet etwas andere Dinge in den beiden Kontexten und es ist wichtig, sie getrennt zu halten.
IIRC, Skeet hat eine gute Erklärung für den Unterschied zwischen Variablen, Namen, Werten und den verschiedenen Bedeutungen von "Referenz".

(Wenn Sie sich eine Variable als eine Box vorstellen, in der Sie Dinge und Referenzen als Strings platzieren können, ist der erste "Verweis" ein String, der an ein Ding gebunden ist und der zweite "Verweis" ist ein String . zu einem Kasten)

(und Referenzparameter ++ C werden, indem die Adresse umgesetzt - es ist die einfachste und effizienteste Weg ist, um etwas an anderer Stelle gespeichert zu verweisen)

2

Wenn ich Ihre Frage richtig verstanden habe, ist es schwierig für Sie zu wissen, ob es Referenz oder Werttyp ist.

Der einfache Weg zu tun ist zu wissen, was Sie einen Anruf oder eine Struktur verwenden.

Alle Klassen sind Referenztypen und alle Strukturen sind Werttypen. Auch int ist struct

public struct Int32 

in gleicher Weise Bool ist auch

public struct Boolean 

Details der Klasse zu wissen, dass Sie auf Stichwort 'f12' drücken.