Класс внутри структуры - PullRequest
       1

Класс внутри структуры

5 голосов
/ 05 февраля 2011

Может кто-нибудь объяснить, что происходит, когда ссылочный тип определен внутри типа значения.Я пишу следующий код:

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; }
            }

        }

    }

}

Какие выходы:

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

Мне любопытно узнать, после вызова метода Test(ObjVal, ObjValRef), как значения ReferenceTypeизменен на 50, который находится внутри ValueType, значение которого не изменилось?

Ответы [ 5 ]

2 голосов
/ 05 февраля 2011

Я точно не знаю, но компилятор, вероятно, разделяет код на отдельный класс, а затем просто применяет требуемые правила.Когда вы используете тип значения, значение копируется каждый раз, когда оно передается в метод.Ссылка на ссылочный тип будет скопирована, но она ссылается на тот же объект.Этот же ссылочный объект будет изменен, в то время как тип значения, который был скопирован , будет изменен.Оригинал, который вы передали, не будет отражать изменения в копии.

2 голосов
/ 05 февраля 2011

Поскольку ссылочные типы являются ссылочными типами, а типы значений являются типами значений.Неважно, где они проживают.

А также тип значения не меняется и не меняет ссылку на ее удержание. Это ссылочный тип, который изменяется (внимательно прочитайте мои слова).

т.е. базовые данные по этому адресу изменяютсяСсылка, хранимая по типу значения, остается прежней.

1 голос
/ 05 февраля 2011

Ссылочные типы передаются в методы как указатель, поэтому при изменении содержимого будет изменяться то же место в памяти Типы значений передаются в методы путем отправки значения в стек вызовов.

1 голос
/ 05 февраля 2011

Значение внутри типа значения является справочным, что оно не изменено. Но значение, на которое указывает ссылка, может быть легко изменено.

0 голосов
/ 05 февраля 2011

при программировании важно понимать, что вызов метода, который принимает аргументы , подразумевает / включает / совпадает с присвоением значений этим аргументам .плюс:

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();

}

должен дать тот же результат, что и ваш пример выше.когда вы объявляете ValueType v = ObjVal; , вы делаете копию фактического объекта структуры, что означает, что v является отдельным объектом все вместе.поэтому изменение значений его членов не повлияет на ObjVal.

однако, ReferenceType r = ObjValRef; делает копию ссылкой .Итак, теперь есть две ссылки, ObjValRef и r , указывающие на один и тот же объект.А именно объект, созданный при вызове new ValueType.ReferenceType (10);

, поэтому при изменении членов объекта указывало на по любой из этих двух ссылок, этот объектизменения, независимо от того, какой указатель используется для выполнения изменения.

о, согласно .. ссылка является просто адресом объекта.часто это 32-разрядное число, но оно меняется от языка к языку и от процессора к процессору.

и изменение эталонной копии само по себе, например, r = null; не будетвлияет на «оригинальную» ссылку ObjValRef, поскольку r является копией ObjValRef, а не самой ObjValRef.просто кажется, что они одинаковы, поскольку они оба указывают на один и тот же объект.

вы можете думать о реальном объекте как о месте (парк или какое-то известное здание, может быть, «парк белой горы»)и ссылки как уличные указатели, указывающие на это место.может быть много уличных указателей, указывающих на одно и то же место, но это не значит, что здесь много «белых горных парков».и это разница между типами значений и ссылочными типами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...