5 Stimmen

Klasse innerhalb der Struktur

Könnte mir bitte jemand erklären, was passiert, wenn ein Referenztyp innerhalb eines Werttyps definiert wird? Ich schreibe den folgenden Code:

namespace ClassInsideStruct
{
    class ClassInsideStruct
    {
        static void Main(string[] args)
        {

            ValueType ObjVal = new ValueType(10);
            ObjVal.Display();

            ValueType.ReferenceType ObjValRef = new ValueType.ReferenceType(10);
            ObjValRef.Display();

            Test(ObjVal, ObjValRef);

            ObjVal.Display();
            ObjValRef.Display();

            Console.ReadKey();

        }

        private static void Test(ValueType v, ValueType.ReferenceType r)
        {
            v.SValue = 50;
            r.RValue = 50;
        }

    }

    struct ValueType
    {

        int StructNum;
        ReferenceType ObjRef;

        public ValueType(int i)
        {
            StructNum = i;
            ObjRef = new ReferenceType(i);
        }

        public int SValue
        {
            get { return StructNum; }
            set
            {
                StructNum = value;
                ObjRef.RValue = value;
            }
        }

        public void Display()
        {
            Console.WriteLine("ValueType: " + StructNum);
            Console.Write("ReferenceType Inside ValueType Instance: ");
            ObjRef.Display();
        }

        public class ReferenceType
        {

            int ClassNum;

            public ReferenceType(int i)
            {
                ClassNum = i;
            }

            public void Display()
            {
                Console.WriteLine("Reference Type: " + ClassNum);
            }

            public int RValue
            {
                get { return ClassNum; }
                set { ClassNum = value; }
            }

        }

    }

}

Welche Ausgaben:

ValueType: 10
ReferenceType Inside ValueType Instance: Reference Type: 10
Reference Type: 10
ValueType: 10
ReferenceType Inside ValueType Instance: Reference Type: 50
Reference Type: 50

Ich möchte wissen, ob nach dem Aufruf der Methode Test(ObjVal, ObjValRef) , wie die Werte von ReferenceType wird auf 50 geändert, das sich innerhalb der ValueType deren Wert nicht verändert wird?

2voto

Scott M. Punkte 7188

Ich weiß es nicht genau, aber der Compiler trennt den Code wahrscheinlich in eine eigene Klasse und setzt dann nur die erforderlichen Regeln durch. Wenn Sie einen Werttyp verwenden, wird der Wert jedes Mal kopiert, wenn er an eine Methode übergeben wird. Der Verweis auf einen Referenztyp wird kopiert, aber er bezieht sich auf dasselbe Objekt. Dieses Referenzobjekt wird geändert, während die Wertart, die kopiert wird geändert. Das von Ihnen übermittelte Original spiegelt die Änderungen in der Kopie nicht wider.

2voto

Shekhar_Pro Punkte 17558

Denn Referenztypen sind Referenztypen und Werttypen sind Werttypen. Ganz gleich, wo sie sich befinden.

Und auch der Werttyp ändert sich nicht, noch ändert sich die Referenz, die er enthält. Es ist der Referenztyp, der geändert wird. (Lesen Sie meine Worte aufmerksam).

d.h. die zugrunde liegenden Daten an dieser Adresse werden geändert. Der von der Wertart gehaltene Verweis ist immer noch derselbe.

1voto

gor Punkte 11180

Der Wert innerhalb der Wertart ist eine Referenz, die nicht verändert wird. Aber der Wert, auf den der Verweis zeigt, kann leicht geändert werden.

1voto

BSick7 Punkte 575

Referenztypen werden als Zeiger an Methoden übergeben, so dass eine Änderung des Inhalts die gleiche Stelle im Speicher verändert. Werttypen werden an Methoden übergeben, indem der Wert auf dem Aufrufstapel abgelegt wird.

-1voto

davogotland Punkte 2687

Bei der Programmierung ist es wichtig zu verstehen, dass Aufruf einer Methode, die Argumente entgegennimmt impliziert/umfasst/ist dasselbe wie Zuweisung von Werten zu diesen Argumenten . plus:

static void Main(string[] args)
{

    ValueType ObjVal = new ValueType(10);
    ObjVal.Display();

    ValueType.ReferenceType ObjValRef = new ValueType.ReferenceType(10);
    ObjValRef.Display();

    //call to Test(ObjVal, ObjValRef); replaced by the following 4 lines
    ValueType v = ObjVal;
    ReferenceType r = ObjValRef;
    v.SValue = 50;
    r.RValue = 50;

    ObjVal.Display();
    ObjValRef.Display();

    Console.ReadKey();

}

sollte dasselbe Ergebnis liefern wie in Ihrem Beispiel oben. wenn Sie erklären ValueType v = ObjVal; Sie machen eine Kopie des eigentlichen struct-Objekts, was bedeutet, dass v ein separates Objekt ist. Wenn Sie also die Werte seiner Mitglieder ändern, hat das keine Auswirkungen auf ObjVal.

jedoch, ReferenceType r = ObjValRef; macht eine Kopie von eine Referenz . Jetzt gibt es also zwei Referenzen, ObjValRef et r , die auf dasselbe Objekt zeigen. Nämlich das Objekt, das beim Aufruf von new ValueType.ReferenceType(10);

so dass beim Ändern von Mitgliedern des Objekts hingewiesen auf durch einen dieser beiden Verweise, ändert sich dieses Objekt, unabhängig davon, welcher Zeiger zur Durchführung der Änderung verwendet wird.

ach ja eine referenz ist einfach eine adresse eines objekts. oft ist das eine 32-bit-nummer, aber das ändert sich von sprache zu sprache und von prozessor zu prozessor.

und die Änderung der Referenzkopie an sich, z. B. r = null; wirkt sich nicht auf den "ursprünglichen" Verweis ObjValRef aus, da r eine Kopie von ObjValRef ist und nicht ObjValRef selbst. Es scheint nur so, als ob sie dasselbe sind, da sie beide auf dasselbe Objekt zeigen.

man kann sich das eigentliche objekt als einen ort vorstellen (einen park oder ein berühmtes gebäude, vielleicht "white mountain park") und die referenzen als straßenschilder, die auf diesen ort hinweisen. es kann viele straßenschilder geben, die auf denselben ort hinweisen, aber das bedeutet nicht, dass es viele "white mountain park" gibt. und das ist der unterschied zwischen Werttypen und referenztypen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X