C#

Рекламный модуль
http://www.arpefly.ru

Исследуем тип string

Строка (string) — это объект, а следовательно, ссылочный тип. Тип string имеет методы и свойства. Типы значений, такие как double и int, тоже имеют методы и свой¬ства, но string — это первый из рассматриваемых типов, который на самом деле явля¬ется объектом, поэтому давайте исследуем его подробнее. Чтобы исследовать тип, вы можете читать документацию или воспользоваться средством IntelliSense. Чтение документации — неплохая идея, но это долго и трудно. IntelliSense — это средство интегрированной среды разработки (IDE), представляющее методы и свойства определенного типа легким для понимания способом. В первое время использование IntelliSense может немного нервировать, поскольку он, кажется, живет собственной жизнью, независимо от IDE. Небольшая инструкция по использованию IntelliSense приведена на рис. 3.2. Я рекомендую вам уделить некото¬рое время экспериментам с IntelliSense. Я также рекомендую вам включить IntelliSense в IDE Visual C# Express. IntelliSense работает только для определенных переменных, имеющих тип. На рис. 3.2 средство IntelliSense сработало потому, что среда IDE анализирует код и способна чи¬тать метаданные, связанные с типом. Метаданные (metadata) — это данные, которые описывают ваш исходный код. Мы создаем его всякий раз, когда определяем класс, метод или свойство. Описания методов и свойств — это часть метаданных, отображаемых IntelliSense. Фактически одним из преимуществ платформы .NET является то, что мета¬данные имеют все типы. Объект — основа всех типов Практически все в .NET является объектами, обладающими несколькими базовыми свойствами и методами. Вот четыре базовых метода, связанных с каждым объектом. • Equals {). Проверяет равенство двух объектов (рис. 3.3). • GetHashCode (). Возвращает уникальное число, описывающее объект (рис. 3.4). Два объекта с одинаковым содержимым возвратят одинаковый хеш-код. • GetType (). Возвращает метаданные, связанные с объектом (рис. 3.5). Позволяет программе динамически выяснять, какие методы и свойства какому типу принад¬лежат. Это используется IntelliSense, чтобы отобразить обычный список. • ToString (). Преобразует содержимое типа в строку (рис. 3.6). Обратите внима¬ние, стандартная реализация CLR метода ToString () работает только для типов значений. Четыре базовых метода можно применить к любой объявленной переменной. Вы ис¬пользуете метод ToString () при отладке или проверке состояния экземпляра объекта во время выполнения. Метод ToStringO возвращает понятную человеку строку, которая содержит состояние экземпляра объекта. Вы можете использовать метод GetType () время от времени, но IDE и другие ин¬струменты используют его регулярно. Этот метод позволяет выяснить возможности переменной во время выполнения программы. На техническом языке, метод GetType () возвращает формальное описание метаданных типа. Из чтения описаний методов Equals () и GetHashCode () вы могли бы предположить, что эти две функции преследуют одну и ту же цель. Но дело обстоит не так. Предположим, вы сложили и упаковали в две коробки кухонную утварь. В обеих ко¬робках по пять красных блюд, три серебряных вилки, два медных ножа и два бокала. Если вы сравните коробки, методы Equals О и GetHashCode О укажут на равенство, ко¬робки содержат одинаковое количество предметов одинаковых цветов. Важно уяснить, что, несмотря на совпадение предметов в двух коробках, они являются уникальны¬ми экземплярами, содержащими уникальные предметы, хоть их содержимое и иден¬тично. Когда вы сравниваете экземпляры объектов с помощью методов Equals () или GetHashCode (), вы сравниваете метаданные и оцениваете атрибуты, а не индивидуаль-ные экземпляры. Теперь представьте, что бокалы в одной из коробок от IKEA, а в другой — от Pier 1. Если для сравнения коробок вы используете метод Equals (), он возвратит значение false, поскольку в подробностях содержимое коробок не идентично. Различие заключа¬ется в описании бокалов. Вызов метода GetHashCode (), напротив, укажет, что содержи¬мое коробок идентично. Это связано с тем, что метод GetHashCode () осуществляет бы¬струю идентификацию содержимого. Различие между методами Equals () и GetHashCode () в точке зрения. С точки зрения транспортной компании, коробки идентичны, поскольку ее не заботит, лежат ли там бокалы от IKEA или от Pier 1; перевозчикам безразличен производитель бокалов. Тот факт, что метод GetHashCode О может вернуть одинаковые числа для объектов с, казалось бы, несходным содержимым, может запутать разработчиков. Преимущество метода GetHashCode () в том, что, полезный при проверке равенства, он еще более по¬лезен при проверке неравенства. Если два объекта возвращают разные значения хеш-кода, то вы знаете, что содержимое не идентично. Назначение хеш-кода в том, чтобы быстро снять отпечатки пальцев содержимого объекта. Это не абсолютно надежно, но срабатывает обычно быстро. Когда IntelliSense не достаточно Система IntelliSense очень полезна, она отображает даже комментарии, объясняющие, что делает метод (см. рис. 3.2). Еще одно место для поиска ответов — это сама документация Microsoft, к которой можно обратиться, выбрав пункт меню Help^lndex (Справка^Индекс). Чтобы поискать определенный тип, вы можете использовать поле Look For (Поиск). Например, если вы введете в поле поиска String class, то увидите подробности о классе string, которые можно от¬фильтровать, используя ссылки верху страницы. Документация Microsoft — это часть библиотеки сети разработчиков Microsoft (Microsoft Developer Network — MSDN) на веб-сайте http://msdn.micro8oft.com. Веб¬сайт MSDN содержит документацию, которая поможет вам изучить интерфейс приклад-нык программ (Application Programming Interface — API) стандартного комплекта разра¬ботчика программного обеспечения (Software Development Kit — SDK) .NET. Существуют буквально тысячи типов, предоставляющих свои методы и свойства. Вряд ли вы ис¬пользуете их все в одном приложении, но SDK .NET вы будете использовать всегда. В большинстве случаев веб-сайт MSDN вполне способен предоставить всю необхо¬димую информацию о любом типе. Но если вы хотите узнать больше, то просмотрите такие веб-сайты, как Code Project (http: //www. codeproj ect. com). Сайт содержит множе¬ство примеров по практически каждой теме разработки, которая может прийти на ум. Проблема: посимвольное сравнение Давайте вернемся к ошибке отступа. Проблемы создавал метод CompareToО. Рассматривая документацию MSDN, вы можете найти следующее определение для это¬го метода (достаточно прокрутить страницу класса String вниз и щелкнуть на ссылке CompareTo). Сравнивает данный экземпляр с определенным объектом. Это определение говорит вам немного, так что вам нужно щелкнуть на имени дру¬гого метода под заголовком Reference (Ссылка). (Зачастую объявление другого метода, доступного по ссылке, содержит объяснение общих концепций.) Щелкните на ссылке метода Compare О , а затем Compare (string, string). В объяснении метода Compare () вы найдете следующий текст. Сравнение завершается, когда обнаруживается первое неравенство символов или обе строки заканчиваются. Однако, если обе строки равны до конца одной из строк, но в другой строке символы еще остались, то более длинная строка считается большей. Возвращаемое значение — результат сравнения, выполняемого последовательно. На заметку. Поиск описания метода — процесс недолгий, даже если он находится в описании другого метода. Накопив некоторый опыт, вы даже перестанете обращать внимание на допол¬нительные щелчки. Метод CompareTo () терпит неудачу из-за посимвольного сравнения, которое проил-люстрировано на рис. 3.7. Как вы знаете, строки хранятся в областях памяти, называемых буферами (buffer), где каждый пробел занимает один символ (см. рис. 3.7). Иногда это можно использовать, как будет показано в следующем разделе. Теперь, когда вы знаете, в чем проблема, пришло время искать решение.