ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Шрифт:
Есть много алгоритмов, которые можно использовать для создания хеш-кода, как "изощренных", так и достаточно "простых". Еще раз подчеркнем, что значение хеш-кода объекта зависит от состояния этого объекта. Класс System.String имеет довольно солидную реализацию GetHashCode, основанную на значении символьных данных. Поэтому, если можно найти строковое поле, которое будет уникальным для всех рассматриваемых объектов (например, поле SSN для объектов Person), то можно вызвать GetHashCode для строкового представлении такого поля.
Если вы не сможете указать подходящий элемент данных, но переопределите ToString, то можно просто возвратить хеш-код
Тестирование переопределенных членов
Теперь можно проверить обновленный класс Person. Добавьте следующий программный код в метод Main и сравните результат его выполнения с тем, что показано на рис. 3.18.
Рис. 3.18. Результаты переопределения членов System.Object
Статические члены System.Object
В завершение нашего обсуждения базового класса .NET, находящегося на вершине иерархии классов, следует отметить, что System.Object определяет два статических члена (Object.Equals и Object.ReferenceEquals), обеспечивающих проверку на равенство значений и ссылок соответственно. Рассмотрим следующий программный код.
Исходный код. Проект ObjectMethods размещен в подкаталоге, соответствующем главе 3.
Типы данных System (и их обозначения в C#)
Вы,
наверное, уже догадались, что каждый внутренний тип данных C# – это на самом деле сокращенное обозначение некоторого типа, определенного в пространстве имен System. В табл. 3.11 предлагается список типов данных System, указаны их диапазоны изменения, соответствующие им псевдонимы C# и информация о согласованности типа со спецификациями CLS.Таблица 3.11. Типы System и их обозначения в C#
Обозначение в C# | Согласованность с CLS | Тип System | Диапазон изменения | Описание |
---|---|---|---|---|
sbyte | Нет | System.SByte | от -128 до 127 | 8-битовое число со знаком |
byte | Да | System.Byte | От 0 до 255 | 8-битовое число без знака |
short | Да | System.Int16 | от -32768 до 32767 | 16-битовое число со знаком |
ushort | Нет | System.UInt16 | от 0 до 65535 | 16-битовое число без знака |
int | Да | System.Int32 | от -2147483648 до 2147483647 | 32-битовое число со знаком |
Uint | Нет | System.UInt32 | от 0 до 4294967295 | 32-битовое число без знака |
long | Да | System.Int64 | от -9223372036854775808 до 9223372036854775807 | 64-битовое число со знаком |
ulong | Нет | System.UInt64 | от 0 до 18446744073709551615 | 64-битовое число без знака |
char | Да | System.Char | от U0000 до Uffff | Отдельный 16-битовый символ Unicode |
float | Да | System.Single | от 1.5x10– 45 до 3.4x1038 | 32-битовое число с плавающим десятичным разделителем |
double | Да | System.Double | от 5.0х10– 324 до 1.7х10308 | 64-битовое число с плавающим десятичным разделителем |
bool | Да | System.Boolean | true или false | Представляет истину или ложь |
decimal | Да | System.Decimal | от 100 до 1028 | 96-битовое число со знаком |
string | Да | System.String | Ограничено системной памятью | Представляет набор символов Unicode |
object | Да | System.Object | Любой тип можно сохранить в объектной переменной | Базовый класс всех типов во вселенной .NET |
Замечание. По умолчанию действительный числовой литерал справа от операции присваивания интерпретируется, как double. Поэтому, чтобы инициализировать переменную типа float, используйте суффикс f или F (например 5.3F).
Интересно отметить, что и примитивные типы данных .NET организованы в иерархии классов. Отношения между этими базовыми типами (как и некоторыми другими типами, с которыми мы познакомимся чуть позже) можно представить так, как показано на рис. 3.19.
<