Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Struct myStruct

Class MyClass

Namespace Сh09Ex03

Типы структур

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

1. Создать новое консольное приложение с именем Сh09Ex03 в директории C:\BegCSharp\Chapter9.

2. Измените код следующим образом:

{

{

public int val;

}

{

public int val;

}

/// <summary>

/// Summary description for Class1.

/// </summary>

{

static void Main(string[] args)

{

MyClass objectA = new MyClass ();

MyClass objectB = objectA;

objectA. val = 10;

objectB.val = 20;

myStruct structA = new myStruct();

myStruct structB = structA;

structA.val = 30;

structB.val =40;

Console. WriteLine(“objectA. val = {0}", objectA.val);

Console.WriteLine(“objects.val = {0}”, objectB.val);

Console.WriteLine(“structA.val = {0}”, structA.val);

Console.WriteLine(“structB.val = {0}”, structB.val);

Console.ReadLine();

}

}

}

3. Запустите приложение.

В этом приложении содержатся два определения типов, одно из которых описывает структуру с именем myStruct, обладающую единственным общим полем типа int с именем val, а второе описывает класс с именем MyClass, который содержит аналогичное поле. Далее мы выполняем одинаковые операции над экземплярами обоих типов:

• Объявляем переменную данного типа.

• Создаем новый экземпляр переменной данного типа.

• Объявляем вторую переменную данного типа.

• Присваиваем первую переменную второй переменной.

• Присваиваем значение полю val первого экземпляра переменной.

• Присваиваем значение полю val второго экземпляра переменной.

• Выводим значение поля val обеих переменных.

Хотя мы выполняем над переменными разных типов одни и те же операции, окончательные результаты оказываются различными. При выводе значений поля val обнаруживается, что обе переменные типа object обладают одинаковым значением, в то время как переменные типа структуры имеют различающиеся значения.

Итак, что же произошло?

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

Структуры — это значимые типы. В переменных не хранится никаких ссылок на структуру, вместо этого в них хранится сама структура. Поэтому, когда одна структура присваивается другой переменной типа MyStruct, происходит копирование всей информации из одной структуры в другую. Это поведение идентично тому, которое мы наблюдали ранее для переменных простых типов, таких как тип int.

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

Весь механизм использования указателей скрыт от нас в управляемом коде, что позволяет этому коду быть существенно проще. На самом деле в С# существует возможность получить доступ к операциям более низкого уровня, таким как манипуляции над указателями, воспользовавшись "небезопасным" кодом, однако эту сложную тему мы здесь рассматривать не будем.




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 369; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.