скрытые фичи C#

ДРОЗДОВ АНДРЕЙ AKA SULVERUS

Спецвыпуск: Хакер, номер #071, стр. 071-076-1

OFFBIT SECURITY TEAM(SULVERUS@MAIL.RU)

ОБЗОР НЕСТАНДАРТНЫХ ВОЗМОЖНОСТЕЙ C#

ЗА МИЛЛИОНЫ ЛЕТ ДО НАШЕЙ ЭРЫ ПОЯВИЛСЯ ПЕРВЫЙ ЖИВОЙ ОРГАНИЗМ. СО ВРЕМЕНЕМ ОН РАЗВИВАЛСЯ, ПОЯВИЛИСЬ РЕПТИЛИИ, ПОТОМ МЛЕКОПИТАЮЩИЕ, И, В КОНЦЕ КОНЦОВ, ПОЯВИЛСЯ ЧЕЛОВЕК. А ЧЕЛОВЕК РАЗУМНЫЙ, В ЛИЦЕ КОРПОРАЦИИ МАЙКРОСОФТ, СО ВРЕМЕНЕМ ПОРОДИЛ ПЛАТФОРМУ .NET, ДЛЯ КОТОРЫЙ БЫЛ СОЗДАН СПЕЦИАЛЬНЫЙ ЯЗЫК C#, ВЗЯВШИЙ ВСЕ ЛУЧШЕЕ ИЗ С, С++, VISUALBASIC'А И ЯВЫ. ТАКЖЕ ГОСПОДА ИЗ МАЙКРОСОФТ СДЕЛАЛИ КОД «УПРАВЛЯЕМЫМ», ПРИДУМАЛИ РЕФЛЕКСИЮ ТИПОВ, МЕТОД ИНДЕКСАТОРА, ДЕЛЕГАТЫ И ДОБАВИЛИ ЕЩЕ МНОГО НОВЫХ ВОЗМОЖНОСТЕЙ. В ДАННОЙ СТАТЬЕ МЫ УЗНАЕМ ВСЕ ПОДНОГОТНУЮ ЯЗЫКА C#

[интро.]

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

- С/С++: ВОЗМОЖНОСТЬ ПЕРЕГРУЗКИ ОПЕРАТОРОВ ДЛЯ ТИПОВ, СОЗДАННЫХ ПРОГРАММИСТОМ, ИНТЕГРАЦИЯ COM(КАК И В JAVA).

- JAVA: АВТОМАТИЧЕСКОЕ УПРАВЛЕНИЕ ПАМЯТЬЮ.

- VISUAL BASIC: ИСПОЛЬЗОВАНИЕ СВОЙСТВ-КЛАССОВ.

- RUBY: РЕФЛЕКСИЯ ТИПОВ.

[создаем жука для опытов.]

Для наших опытов нам нужно будет написать класс, над которым мы будем издеваться. Назовем его bug. В этой статье я бы хотел рассмотреть технологии организации двухстороннего взаимодействия объектов в приложении - это делегаты и события. Так же мы узнаем о том, как можно перегружать операторы в C#, для большей наглядности я буду приводить «примеры из жизни», то есть показывать, для чего тот или иной алгоритм нужен программисту или хакеру. Начнем мы с простого, а именно - с перегрузки операторов. Я приведу несложный пример перегрузки оператора сложения. Напишем функцию, аналогичную функции strcpy в С++. Для начала мы объявим новую функцию в нашем классе: public static void strcpy(string to, string from). Теперь, для того чтобы сложить нужные нам строковые данные, мы просто будем использовать оператор сложения(«+»):

string result = to + from;

Это элементарно. Желающие могут реализовать функцию, аналогичную lstrcpy :). Теперь перейдем к более серьезной перегрузке операторов, например, к перегрузке операторов равенства. Если мы хотим сравнить не просто какие-то два числа, а, предположим, два структурных типа данных, мы будем использовать метод Object.Equals().

перегрузка операторов равенства

public override bool Equals(object obj)

{

if (((bug)obj).bugA == this.bugA && ((bug)obj).bugB == this.bugB) //перегружаем операторы

return true; //если равны

else

return false; //если не равны

}

Разберем написанный код: слово override указывает на то, что мы будем использовать перегрузку; в роли параметров для функции будут служить 2 объекта; также мы заранее объявили 2 переменные типа int с именами bugA и bugB. Далее мы замещаем метод Equals(): в случае, если переменные равны, то возвращается значение true, в обратном случае передается значение false(вполне естественно, ведь мы используем логический тип данных bool). Так же для удачного замещения необходимо выполнить замещение GetHashCode(). Для этого напишем еще одну функцию, возвращающую это замещение: объявляем тип public override int и говорим ему возвращать HashCode: return this.ToString().GetHashCode(). Чтобы усвоить вышесказанное, перейдем к примеру, из которого видно, зачем нужно столько непонятного кода.

Содержание  Вперед на стр. 071-076-2
ttfb: 3.2689571380615 ms