Главная » C# » Исследование строкового в Visual C# (Sharp)

0

Строка является  объектом  и,  поэтому,  ссылочным  типом.  Строковый тип  string

имеет методы  и свойства.  Обычные типы, такие как double и  int, также имеют

методы и свойства, но строковый тип является первым действительным объектом, который нам нужно рассмотреть.

Тип можно изучить, читая соответствующую документацию или воспользовавшись возможностью IntelliSense среды разработки. Чтение документации имеет свои достоинства, но это наиболее медленный и наиболее тягостный способ. Более удобным является использование IntelliSense, когда методы и свойства определеого типа выводятся на экран в легко поддающемся пониманию формате.

При первом использовании IntelliSense может показаться, что вместо помощи  он просто лезет под руку в самое неподходящее время, но со временем его помощь трудно будет переоценить. Процедура применения IntelliSense проиллюстрирована на рис. 3.2. Я бы  порекомендовал вам потратить  несколько минут на эксперимеирование с использованием этой возможности. Я также рекомендую постоянно держать IntelliSense включенным в Visual С# Express.

Рис. 3.2. Демонстрация использования IntelliSense на примере со строковой переменной

IntelliSense работает только с переменными определенного типа. Принцип его роты основан  на синтаксическом анализе кода средой  разработки  и чтении  мета-

данных, ассоциированных с данным типом. Метаданные— это данные, которые описывают исходный код. Всякий раз при определении класса с ним ассоциируются методы и свойства. Описания методов и свойств и являются элементами метадаых, выводимых IntelliSense. Обстоятельство, что все типы имеют метаданные, яяется одним из достоинств .NET.

КОГДА      ИНФОРМАЦИИ     ОТ     INTELLISENSE     НЕДОСТАТОЧНО

IntelliSense является хорошим гидом и  даже  показывает объяснения  о  том,  что даый метод делает (см. рис. 3.2). Но иногда этих объяснений недостаточно;  в  таком случае требующуюся информацию можно найти в документации Microsoft, к  которой можно получить доступ, выбрав последовательность команд меню Help | Index. Иормацию о конкретном типе можно найти, введя его имя в поле Look for. Например, если  ввести  в это поле текст "String  class",  то будет выведена  подробная  информация о классе string, которую потом можно будет отфильтровать в поле Filtered by.

Документация Microsoft в Visual С# Express является частью библиотеки Microsoft Devel- oper Network (MSDN) (http://msdn.microsoft.com). Web-страница MSDN содержит докентацию, которая поможет вам разобраться  с  интерфейсом  API  стандартного  набора SDK  .NET.  Существует  буквально тысячи  типов  и  неимоверное  количество  их  методов и  свойств. Хотя  вы  вряд ли  используете даже малую толику этих классов и  их методов и свойств в одном приложении, вы всегда будете использовать набор SDK .NET.

В большинстве случаев MSDN будет достаточно, чтобы получить необходимую иормацию о типе. Но если вам захочется узнать побольше о концепциях, то можете поискать требуемую информацию в Интернете. Одним  из таких дополнительных источнов информации может быть Web-страница Code Project (http://www.codeproject.com). Данная Web-страница содержит множество примеров на практически любую тему разработки,  которая может прийти вам в голову.

Основа всех типов: объект

По умолчанию, все элементы в .NET являются объектами, имеющими несколько оовных свойств и методов. С каждым объектом ассоциируются четыре базовых метода:

• Equals ()  — удостоверяет равенство двух объектов (рис. 3.3);

• GetHashCode () — получает уникальное число, описывающее объект (рис. 3.4).

Объекты, имеющие одинаковое содержимое, возвращают одинаковый хэш-код;

• GetType () —  получает  метаданные,  ассоциированные  с  объектом  (рис. 3.5).

Позволяет программе динамически определить методы и свойства объекта. Этот метод применяется в IntelliSense для вывода на экран списка;

• Tostring () —  преобразует  содержимое  переменной  типа  в  строку  (рис. 3.6).

Обратите внимание, что стандартная реализация метода Tostring ()  в среде CLR применима только с обычными типами.

Данные четырех базовых методов можно вызывать для любой объявленной перенной. Мы будем применять метод Tostring () при отладке и исследовании стояний экземпляров объектов во время исполнения программы. Метод Tostring () возвращает строку в читаемом формате, содержащую состояние экземпляра объекта.

Рис. 3.3. Метод Equals ()  применяется для проверки двух объектов на равенство

Рис. 3.4. Метод GetHashCode ()  получает уникальное число, описывающее объект

Рис. 3.5. Метод GetType ()  получает метаданные, ассоциированные с объектом

Рис. 3.6. Метод Tostrin g ()  преобразует числовое содержимое переменной в строку

Программисты могут изредка прибегать к использованию метода GetTypeO, но среда разработки и другие инструменты применяют этот метод постоянно. С пощью метода GetType () можно узнать возможности переменной во время испоения программы. В технических терминах метод GetTypeO возвращает формалое описание на основе метаданных этого типа.

При чтении описания методов Equals!) и GetHashCode!) у вас может сложиться впечатление, что эти две функции имеют одинаковое назначение. Но это не так.

Допустим, что вы переезжаете и упаковали кухонную утварь в два ящика. В  каом из этих ящиков находятся одинаковые предметы: пять красных тарелок, две серебряные вилки, два ножа с медными рукоятками и два бокала для вина. Сравная ящики, методы Equals () и GetHashCode!) возвратят положительный результат, означающий, что оба ящика содержат одинаковое количество одинаковых предмов. Важно понимать, что даже хотя каждый из этих двух  ящиков  является унальным экземпляров своего класса, содержащим уникальные предметы, их сержимое одинаково. При сравнении экземпляров объектов с помощью метода Equals () или GetHashCode () мы сравниваем атрибуты метаданных и значений, а не уникальные экземпляры.

Теперь представьте, что винные бокалы в одном ящике хрустальные от известного производителя, а в другом — стеклянные подделки типа "Made in China". Сравная ящики с помощью метода Equals (), мы получим отрицательный результат, т. к. свойства содержимого ящиков отличаются. Разница заключается в наших фужерах для вина. А вот метод GetHashCode () будет продолжать указывать, что содержимое ящиков идентично. Причиной этому является то обстоятельство, что метод GetHashCode ()  выполняет идентификацию содержимого по-быстрому.

Разница между методами Equals!) и GetHashCode () заключается  в точке зрения. С точки зрения перевозчика, ящики одинаковые, т. к. ему безразлично, какого про-

изводства фужеры, но вам — нет, т. к. за хрусталь вы переживаете больше, чем за стекло.

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

Проблема: посимвольное сравнение в Visual C# (Sharp)

Возвратимся к проблеме пробельных символов. Источником этой проблемы явлтся метод CompareTo (). Информацию об этом методе можно найти в документии MSDN, прокрутив страницу справки для класса string до части, содержащей элемент CompareTo, и щелкнув по этому элементу. В результате будет выведена страница, содержащая следующее описание:

Compares  this  instance  with  a  specified object’.

Это не говорит нам о многом, поэтому попробуем найти нужную нам информацию в объяснении родственного метода. Подобные методы часто ссылаются друг  на друга и объясняют общие принципы. Возвратитесь обратно  на страницу справки для класса string и щелкните по ссылке Compare!), а в открывшейся странице щелкните по ссылке Compare (string, string). Прокрутите страницу до раздела Remarks, и в объяснении метода Compare ()  будет содержаться следующий текст:

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

ПРИМЕЧАНИЕ

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

Выполнение метода CompareTo () завершилось неудачей потому, что он сравнивает строки посимвольно (рис. 3.7).

1   Сравнивает данный экземпляр с указанным  объектом.   –    Пер.

Рис. 3.7. Посимвольное сравнение строк методом CompareTo ()

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

Выяснив, в чем заключается проблема, мы можем приступить к поиску ее решения.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии