dotSITE
Вопросы/Ответы Учебник по ASP.NET Форумы
новости материалы решения форумы группы настройки/о проекте

Различия между объектными типами и типами значения

Как уже упоминалось, в C# есть, помимо прочих, два класса типов: объектные типы (reference types) и типы значения (value types). Их отличие заключается в том, что переменные типа значения содержат сами по себе все данные, в то время как переменные ссылочных типов лишь ссылаются на некоторое значение.

То есть, с типами значения все просто - переменные таких типов хранят сами данные, все как обычно. А ссылочные типы ведут себя иначе - при создании нового объекта такого типа сам объект создается в специальном пуле, а переменная представляет всего лишь ссылку на него:

class MyClass
{
    ...
}


MyClass a = new MyClass();

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

MyClass b = a;

При этом все изменения объекта, которые производятся через b отражаются и на a. Также значения ссылок a и b можно изменять - при этом они перестают ссылаться на текущий объект и ссылаются на новый (или не ссылаются ни на что - имеют значение null). Если возникает ситуация, что все ссылки на объект изменили свои значения и на объект больше никто не ссылается, то он становится "бесхозным" - и удаляется.

a = null;
b = null;

Поясним еще одним примером:

class Sample
{
    public int field;
}

...

int i, j;

i = 3;
j = i;

// Выведет: i = 3, j = 3
Console.WriteLine("i = {0}, j = {1}", i, j);

i = 2;

// Выведет: i = 2, j = 3
Console.WriteLine("i = {0}, j = {1}", i, j);

Sample a = new Sample();
a.field = 1;

Sample b = a;

// Выведет a.field = 1, b.field = 1
Console.WriteLine("a.field = {0}, b.field = {1}", a.field, b.field);

a.field = 2;

// Выведет a.field = 2, b.field = 2
Console.WriteLine("a.field = {0}, b.field = {1}", a.field, b.field);
    

Впрочем, при вызове метода можно передать значение типа значения по ссылке - для этого используется модификатор ref.

<< Предыдущая Следующая >>

Контакт Реклама на сайте Спонсорам Веб мастерам

Лицензионное соглашение - © 2000-2012 dotSITE
Хостинг .NET предоставлен PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development