Programming: C#
Учебник по C# 4.1 Различия между объектными типами и типами значения
Источник:
Как уже упоминалось, в 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.
Назад | Вперёд
При перепечатке любого материала
с сайта, видимая ссылка на источник www.warayg.narod.ru
и все имена, ссылки авторов обязательны.
© 2005
|