Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Общая система типов данных в среде .NET. Размерные и ссылочные типы данных.

Читайте также:
  1. DSM — система классификации Американской психиатрической ассоциации
  2. ERP-система
  3. I Объективные характеристики (потребление материальных благ; продолжительность жизни; система образования; время труда; показатель преступности);
  4. I. Исследование свойств форматов сжатия графических данных
  5. I. Общая психопатология.
  6. I. ОБЩАЯ ХАРАКТЕРИСТА ВРАЧЕБНОГО ОКРУГА И РАЙОНА ЕГО ДЕЯТЕЛЬНОСТИ
  7. I. Общая часть
  8. Internet/Intranet-технологии в корпоративных информа­ционных системах.
  9. PDM-система
  10. PR как рационально структурированная система коммуникационного обеспечения деятельности организации

В CLR каждый объект прямо или косвенно является производным от System.Object.

Открытые методы:

Equals Возвращает true, если два объекта имеют одинаковые значения.

GetHashCode В озвращает хеш-код для значения данного объекта. Этот метод следует переопределить, если объекты типа используются в качест­ве ключа в хеш-таблице. Очень неудачно, что этот метод опреде­лен в Object, потому что большинство типов не служат ключами в хеш-таблице; этот метод уместнее было бы определить в интер­фейсе.

ToString По умолчанию возвращает полное имя типа (this.GetTypeQutlName). На практике этот метод переопределяют, чтобы он возвра­щал объект String, содержащий состояние объекта в виде строки. Например, переопределенные методы для таких фундаментальных типов, как Boolean и Int32, возвращают значения объектов в стро­ковом виде. Кроме того, переопределение метода часто применяют при отладке; вызов такого метода позволяет получить строку, со­держащую значения полей объекта. Считается, что ToString «знает о Culturelnfo, связанном с вызывающим потоком.

GetType Возвращает экземпляр объекта, производного от type, который идентифицирует тип объекта, вызвавшего GetType. Возвращаемый объект Туре может использоваться с классами, реализующими от­ражение для получения информации о типе в виде метаданных Метод GetType невиртуальный, его нельзя переопределить, поэтому классу не удастся исказить сведения о своем типе. Таков механизм обеспечения безопасности типов.

Защищенные методы:

MemberwiseClone Этот невиртуальный метод создает новый экземпляр типа и при­сваивает полям нового объекта соответствующие значения объек­та this. Возвращается ссылка на созданный экземпляр

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

CLR поддерживает две разновидности типов: ссылочные (reference types) и значи­мые (value types). Большинство типов в FCL — ссылочные, но программисты чаще всего используют значимые. Память для ссылочных типов всегда выделяется из управляемой кучи, а оператор С# new возвращает адрес в памяти, где размещает­ся сам объект. При работе с ссылочными типами имейте в виду следующие об­стоятельства, относящиеся к производительности приложения:

■ память для ссылочных типов всегда выделяется из управляемой кучи;

■ каждый объект, размещаемый в куче, имеет некоторые дополнительные чле­ны, подлежащие инициализации;

■ незанятые полезной информацией байты объекта обнуляются (это касается полей);

■ размещение объекта в управляемой куче со временем инициирует сборку му­сора.

Если бы все типы были ссылочными, эффективность приложения резко упала бы. Представьте, насколько замедлится выполнение приложения, если при каж­дом обращении к значению типа Int32 будет выделяться память! Поэтому, чтобы ускорить обработку простых, часто используемых типов, CLR предлагает «облег­ченные» типы — значимые. Экземпляры этих типов обычно размещаются в стеке потока (хотя они могут быть встроены и в объект ссылочного типа). В представ­ляющей экземпляр переменной нет указателя на экземпляр; поля экземпляра раз­мещаются в самой переменной. Поскольку переменная содержит поля экземпля­ра, то для работы с экземпляром не нужно выполнять разыменовывание (derefe­rence) экземпляра. Благодаря тому, что экземпляры значимых типов не обраба­тываются сборщиком мусора, уменьшается интенсивность работы с управляемой кучей и сокращается количество наборов (collections), требуемых приложению на протяжении его существования.

В документации по.NET Framework можно сразу увидеть, какие типы относят к ссылочным, а какие — к значимым. Если тип называют классом (class), речь идет о ссылочном типе. Так, классы SystemObject, SystemException, SystemJOfileStream

и SystemRandom — это ссылочные типы. В свою очередь значимые типы в доку­ментации называют структурами (structure) и перечислениями (enumeration). Например, структуры SystemInt32, System Boolean, SystemDecimal, System.TimeSpan и перечисления System DayOFWeek, System IOFileAttributes и SystemDrawingFontStyle являются значимыми типами.

При внимательном знакомстве с документацией можно заметить, что все струк­туры являются прямыми потомками абстрактною типа SystemValueType, который в свою очередь является производным от тина System.Object. По умолчанию все значимые типы должны быть производными от SystemValueType. Все перечисле­ния являются производными от типа SystemEnum, производного от SystemValueType. CLR и языки программирования по-разному интерпретируют перечисления.

При определении собственного значимого типа нельзя выбрать произвольный базовый тип, однако значимый тип может реализовать один или несколько выб­ранных вами интерфейсов. Кроме того, в CLR значимый тип является изолирован­ным, то есть не может служить базовым типом для какого-либо другого ссылочно­го или значимого типа. Поэтому, например, нельзя в описании нового типа указать в качестве базовых Boolean, Char, Int32, Uint64, Single, Double, Decimal и т. д.

■ Объекты значимого типа существуют в двух формах: неупакованной (unboxed) и упакованной (boxed). Ссылочные типы бывают только в упакованной форме.

■ Значимые типы являются производными от System.ValueType. Этот тип имеет те же методы, что и System.Object. Однако SystemValueType переопределяет ме­тод Equals, который возвращает true, если значения полей в обоих объектах совпадают. Кроме того, в SystemValueType переопределен метод GetHashCode, который создает значение хеш-кода с помощью алгоритма, учитывающего значения полей экземпляра объекта. Из-за проблем с производительностью в реализации по умолчанию, определяя собственные значимые типы значений, надо переопределить и написать свою реализацию методов Equals и GetHash­Code.

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

■ Переменные ссылочного типа содержат адреса объектов в куче. Когда пере­менная ссылочного типа создается, ей по умолчанию присваивается null, то есть в этот момент она не указывает на действительный объект. Попытка задейство­вать переменную с таким значением приведет к генерации исключения Null-ReferenceException. В то же время в переменной значимого типа всегда содер­жится некое значение соответствующего типа, а при инициализации всем членам этого типа присваивается 0. Поскольку переменная значимого типа не является указателем, при обращении к значимому типу исключение NullRefe-renceException возникнуть не может. CLR поддерживает понятие особого вида значимого типа, допускающего присваивание null, (mailable types).

■ Когда переменной значимого типа присваивается другая переменная значи­мого типа, выполняется копирование всех ее полей. Когда переменной ссы­лочного типа присваивается переменная ссылочного типа, копируется только ее адрес.

■ Вследствие сказанного в предыдущем абзаце, несколько переменных ссылоч­ного типа могут ссылаться на один объект в куче, благодаря чему, работая с одной переменной, можно изменить объект, на который ссылается другая пе­ременная. С другой стороны, каждая переменная значимого типа имеет соб­ственную копию данных «объекта», и операции с одной переменной значимого типа не повлияют на другую переменную.

■ Так как неупакованные значимые типы не размещаются в куче, память, отве­денная для них, освобождается сразу при возвращении управления методом, в котором описан экземпляр этого типа. Это значит, что экземпляр значимого типа не получает уведомления (через метод Finalize), когда его память осво­бождается.

 

 




Дата добавления: 2015-01-30; просмотров: 86 | Поможем написать вашу работу | Нарушение авторских прав

1 | 2 | 3 | 4 | <== 5 ==> | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав