Классы пространства RegularExpressions

Класс Regex

Это основной класс, объекты которого определяют регулярные выражения. Конструктор класса перегружен. В простейшем варианте ему передается в качестве параметра строка, задающая регулярное выражение. Основные методы класса Regex:

Метод Match запускает поиск соответствия. В качестве параметра методу передается строка поиска, где разыскивается первая подстрока, которая удовлетворяет образцу, заданному регулярным выражением. В качестве результата метод возвращает объект класса Match, описывающий результат поиска.

using System. Text. RegularExpressions;

string FindMatch(string str, string strpat){

Regex pat = new Regex(strpat);

Match match =pat. Match(str);

string found = "";

if (match. Success) {

found =match. Value;

Console. WriteLine("Строка ={0}\tОбразец={1}\t

Найдено={2}", str, strpat, found);

}

return(found);

}

public void TestSinglePat(){

//поиск по образцу первого вхождения

string str, strpat, found;

Console. WriteLine("Поиск по образцу");

//образец задает подстроку, начинающуюся с символа a, далее идут буквы или цифры.

str ="start"; strpat =@"a\w+";

found = FindMatch(str, strpat); //art

str ="fab77cd efg";

found = FindMatch(str, strpat); //ab77cd

//образец задает подстроку, начинающуюся с символа a,

//заканчивающуюся f с возможными символами b и d в середине

strpat = "a(b|d)*f"; str = "fabadddbdf";

found = FindMatch(str, strpat); //adddbdf

НЕ нашли? Не то? Что вы ищете?

//диапазоны и escape-символы

strpat = "[X-Z]+"; str = "aXYb";

found = FindMatch(str, strpat); //XY

strpat = @"\u0058Y\x5A"; str = "aXYZb";

found = FindMatch(str, strpat); //XYZ

}

Метод Matches позволяет разыскать все вхождения, то есть все подстроки, удовлетворяющие образцу. У алгоритма поиска есть важная особенность - разыскиваются непересекающиеся вхождения подстрок. В качестве результата возвращается объект MatchCollection, представляющий коллекцию объектов Match.

void FindMatches(string str, string strpat) {

Regex pat = new Regex(strpat);

MatchCollection match =pat. Matches(str);

Console. WriteLine("Строка ={0}\tОбразец={1}\tНайдено={2}", str, strpat, match. Count);

}

Console. WriteLine("око и рококо");

strpat="око"; str = "рококо";

FindMatches(str, strpat); //найдено =1

 

Метод NextMatch запускает новый поиск, начиная с того места, на котором остановился предыдущий поиск.

Метод Split является обобщением метода Split класса String. Он позволяет, используя образец, разделить искомую строку на элементы. Поскольку образец может быть устроен сложнее, чем простое множество разделителей, то метод Split класса Regex эффективнее, чем его аналог класса String.

static void Main() {

string si = "Один, Два, Три, Строка для разбора"; 1: Один

Regex theRegex = new Regex(" |, |,"); 2: Два

3: Три

int id = 1; 4: Строка

foreach (string substring in theRegex. Split(si)) 5: для

Console. WriteLine("{0}: {1}", id++, substring); 6: разбора

}

Метод Replaceпозволяет делать замену найденного образца. Метод перегружен. При вызове метода передаются 2 строки - первая задает строку, в которой необходимо произвести замену, а вторая - на что нужно заменить найденную подстроку, причем во второй строке можно использовать подстановки (substitutions) - в указанные места будут подставлены значения захваченных групп с заданными именами. Синтаксис подстановок следующий:

$n - Подставляет последнюю подстроку, соответствующую группе с номером n.

Например, обрамляет все последовательности букв 'a' символами подчеркивания (например, строка "bacghghaaab" превратится в "b_a_cghgh_aaa_b"

Regex r = new Regex(@"(a+)");

string s="bacghghaaab";

s=r. Replace(s,"_$1_");

Console. WriteLine("{0}",s);

Можно задать третий параметр, указывающий сколько замен нужно произвести:

Regex r = new Regex(@"(dotsite)");

string s="dotsitedotsitedotsiterulez";

s=r. Replace(s,"f",1);

Console.WriteLine("{0}",s);

Если параметр не задан, то заменяются все найденные образцы.

Также можно задать четвертый параметр, указывающий с какого вхождения производить замены:

Regex r = new Regex(@"(dotsite)");

string s="dotsitedotsitedotsiterulez";

s=r. Replace(s,"f",2,1);

Console. WriteLine("{0}",s);

Классы Match и MatchCollection

Объекты этих классов создаются автоматически при вызове методов Match и Matches. Коллекция MatchCollection, как и все коллекции, позволяет получить доступ к каждому ее элементу - объекту Match. Можно, конечно, организовать цикл foreach для последовательного доступа ко всем элементам коллекции.

При работе с объектами класса Match наибольший интерес представляют не столько методы класса, сколько его свойства, большая часть которых унаследована от родительских классов. Рассмотрим основные свойства:

·  свойства Index, Length и Value наследованы от прародителя Capture. Они описывают найденную подстроку - индекс начала подстроки в искомой строке, длину подстроки и ее значение;

·  свойство Groups класса Match возвращает коллекцию групп - объект GroupCollection, который позволяет работать с группами, созданными в процессе поиска соответствия;

·  свойство Captures, наследованное от объекта Group, возвращает коллекцию CaptureCollection. Как видите, при работе с регулярными выражениями реально приходится создавать один объект класса Regex, объекты других классов автоматически появляются в процессе работы с объектами Regex.

// Программа 7. Поиск всех образцов, соответствующих регулярному выражению

public static void Main( ) {

string si = "Это строка для поиска";

// найти любой пробельный символ следующий за непробельным

Regex theReg = new Regex(@"(\S+)\s");

// получить коллекцию результата поиска

MatchCollection theMatches = theReg. Matches (si);

// перебор всей коллекции

foreach (Match theMatch in theMatches) {

Console. WriteLine( "theMatch. Length: {0}", theMatch. Length);

if (theMatch. Length!= 0)

Console. WriteLine("theMatch: {0}", theMatch. ToString( ));

} }

theMatch. Length: 4

theMatch: Это

theMatch. Length: 7

theMatch: строка

theMatch. Length: 4

theMatch: для

Классы Group и GroupCollection

Коллекция GroupCollection возвращается при вызове свойства Group объекта Match. Имея эту коллекцию, можно добраться до каждого объекта Group. Класс Group является наследником класса Capture и, одновременно, родителем класса Match.

Внимательно рассматривая таблицу, которая описывает символы, используемые в регулярных выражениях, в частности символы группирования, то можно понять несколько важных фактов, связанных с группами:

·  при обнаружении одной подстроки, удовлетворяющей условию поиска, создается не одна группа, а коллекция групп;

·  группа с индексом 0 содержит информацию о найденном соответствии;

·  число групп в коллекции зависит от числа круглых скобок в записи регулярного выражения. Каждая пара круглых скобок создает дополнительную группу, которая описывает ту часть подстроки, которая соответствует шаблону, заданному в круглых скобках;

·  группы могут быть индексированы, но могут быть и именованными, поскольку в круглых скобках разрешается указывать имя группы.

Создание именованных групп крайне полезно при разборе строк, содержащих разнородную информацию.

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

Например, нужно выбрать все подстроки, которые могут являться IP адресами и объединить их вместе. Для этого существует класс Group. Любое регулярное выражение может быть добавлено в группу и представлять свою группу по имени.

Например: @"(? <ip>(\ d |\ .)+)\s "

Имя группы задается в скобках, перед которыми ставится знак (?). Далее следует описание регулярного выражения, определяющего группу. Класс Match явлется производным от класса Group и содержит коллекцию объектов Group, к которым можно обратиться через свойство Groups.

// Программа 8. Создание именованных групп регулярных выражений

public static void Main( ) {

string stringl = "04:03:27 127.0.0.0 *****";

Regex theReg = new Regex(

@"(?<время>(\d|\:)+)\s" +

@"(?<ip>(\d|\ .)+)\s" +

@"(?<url>\S+)");

// группа time = одна и более цифр или двоеточий за которыми следует пробельный символ

// группа ip адрес = одна и более цифр или точек за которыми следует пробельный символ

// группа url = один и более непробельных символов

// получаем коллекцию поиска

MatchCollection theMatches = theReg. Matches (stringl);

foreach (Match theMatch in theMatches) {

if (theMatch. Length!= 0) {

// выводим найденную подстроку

Console.WriteLine("\ntheMatch: {0}", theMatch.ToString ());

// выводим группу "time"

Console. WriteLine ("время: {0}", theMatch. Groups["время"]);

// выводим группу "ip"

Console. WriteLine("ip: {0}", theMatch. Groups["ip"]);

// выводим группу "url"

Console. WriteLine("url: {0}", theMatch. Groups["url"]);

}}}

theMatch: 04:03:27 127.0.0.0 *****

время: 04:03:27

ip: 127.0.0.0

url: GotDotNet.ru

Вопросы к защите лабораторной работы

1.  На какие виды и разновидности разделяются все типы данных в C#? Примеры.

2.  Основное отличие структурных типов?

3.  Основное отличие ссылочных типов?

4.  Перечислить все целочисленные арифметические типы данных в C# и их названия в CLR. Указать их диапазон и размер занимаемой памяти.

5.  Перечислить все вещественные арифметические типы данных в C# и их названия в CLR. Указать их диапазон и размер занимаемой памяти.

6.  Перечислить все символьные типы данных в C# и их названия в CLR. Указать их диапазон и размер занимаемой памяти.

7.  Оператор ветвления if … else и его применение в программах.

8.  Оператор ветвления switch и его применение в программах.

9.  Оператор цикла for и его применение в программах.

10.  Оператор цикла foreach и его применение в программах.

11.  Операторы цикла while и do…while. Применение в программах.

12.  Что такое массив?

13.  Определение одномерного массива в С#. Инициализация одномерного массива.

14.  Определение многомерного массива в С#. Инициализация многомерного массива.

15.  Определение ступенчатых массивов и их инициализация.

16.  Базовый класс Array, его методы и свойства.

17.  Тип char и принимаемые значения переменными типа char.

18.  Методы и свойства класса Char.

19.  Тип char[] и его отличительные особенности от С/С++.

20.  Тип String и способы его конструирования.

21.  Операции над строками типа string.

22.  Задание строковых констант.

23.  Методы и свойства класса String.

24.  Динамические методы и свойства класса String.

25.  Класс StringBuilder. Конструкторы.

26.  Операции над строками StringBuilder.

27.  Основные методы класса StringBuilder.

28.  Что такое регулярные выражения. Применение регулярных выражений.

29.  Задание регулярного выражения. Поиск подстрок с помощью регулярного выражения.

30.  Класс Regex и его методы.

31.  Поиск первого вхождения образца с текст.

32.  Поиск всех вхождений образца в текст.

33.  Замена образца в тексте.

34.  Разбор текста на слова.

35.  Свойства класса Match.

36.  Классы Match и MatchCollection и их свойства.

37.  Классы Group и GroupCollection и их свойства.

Задания к лабораторной работе

1. Проработать примеры 1-8, данные в теоретических сведениях. Создать на их основе программы. Получить результаты работы программ и уметь их объяснить. Внести их в отчет с комментариями.

2. Выполнить два задания на двумерный массив по заданному номеру варианта и номеру, отсчитанному с конца.

1).  Точки на плоскости заданы своими координатами х и у, которые хранятся в двумерном массиве. Найти пару самых удаленных друг от друга точек.

2).  Найти суммы элементов двухмерного массива целых чисел, расположенных на линиях, параллельных главной диагонали, и ниже нее.

3).  Найти номер столбца двухмерного массива целых чисел, для которого среднеарифметическое значение его эле­ментов максимально.

4).  В двухмерном массиве вещественных чисел поменять местами строки и столбцы с одинаковыми номерами.

5).  В двухмерном массиве целых чисел поменять места­ ми столбцы, симметричные относительно середины масси­ва (вертикальной линии).

6).  В двухмерном массиве целых чисел поменять места­ми строки, симметричные относительно середины массива (горизонтальной линии).

7).  Поменять местами значения элементов двухмерно­го массива вещественных чисел, симметричных относитель­но побочной диагонали.

8).  Найти максимальный элемент среди максимальных элементов строк двухмерного массива целых чисел. Опре­делить номер строки и столбца для такого элемента.

9).  Найти максимальный среди минимальных элементов столбцов двухмерного массива целых чисел. Определить номер строки и столбца для такого элемента.

10).Удалить столбец двухмерного массива вещественных чисел, в котором находится максимальный элемент этого массива.

11).  Найти все неповторяющиеся элементы двухмерно­го массива целых чисел.

12).  Заполнить двухмерный массив целыми числами от 1 до 100 по спирали.

13). Определить:

а) сумму элементов главной диагонали массива;

б) сумму элементов побочной диагонали массива.

в) среднее арифметическое элементов главной диагона­ли массива;

г) среднее арифметическое элементов побочной диагонали массива.

14.  Дан двухмерный массив. Вывести на экран его эле­менты следующим образом:

а) сначала элементы первой строки справа налево, затем второй строки справа налево и т. п.;

б) сначала элементы первой строки справа налево, затем второй строки слева направо и т. п.;

в) сначала элементы первого столбца сверху вниз, затем второго столбца сверху вниз и т. п.;

г) сначала элементы первого столбца снизу вверх, затем второго столбца снизу вверх и т. п.

3. Выполнить два задания на строки по заданному номеру варианта и номеру, отсчитанному с конца. Использовать в задачах два класса строк: String и StringBuilder.

1).  Текстовые сообщения часто печатаются строчными буквами, но многие сотовые телефоны имеют встроенные средства преобразования строчной буквы в прописную после символа пунктуации, как точка или знак вопроса. Составить программу, которая будет вводить сообщение в переменную String (на одной строке), а затем обрабатывать его с получением новой строки с прописными буквами в соответствующих местах.

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

3).  Составить программу, которая будет вводить строку в переменную String. Найти в ней те слова, которые начинаются и оканчиваются одной и той же буквой.

4).  Составить программу, которая будет вводить строку в переменную String. Определить, сколько раз в строке встречается заданное слово.

5).  Строка, содержащая произвольный русский текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в этом тексте. Ответ должен приводиться в грамматически правильной форме: например: а — 25 раз, к — 3 раза и т. д.

6).  Двумерный массив n x m содержит некоторые буквы русского алфавита, расположенные в произвольном порядке. Написать программу, проверяющую, можно ли из этих букв составить данное слово S. Каждая буква массива используется не более одного раза.

7).  Дана строка, содержащая текст и арифметические выражения вида a ® b, где ® — один из знаков +, -, *, /. Выписать все арифметические выражения и вычислить их значения.

8).  Составить программу, которая будет вводить строку в переменную String. Удалить из нее все лишние пробелы, оставив между словами не более одного. Результат поместить в новую строку.

9).  Составить программу, которая будет вводить строку в переменную String. Напечатать в алфавитном порядке все слова из данной строки, имеющие заданную длину n.

10).  Составить программу, которая будет вводить строку в переменную String. Найти слово, встречающееся в каждом предложении, или сообщить, что такого слова нет.

11).  Дана строка, содержащая текст на русском языке. В предложениях некоторые из слов записаны подряд несколько раз (предложение заканчивается точкой или знаком восклицания). Получить в новой строке отредактированный текст, в котором удалены подряд идущие вхождения слов в предложениях.

12).  Даны две строки А и B. Составьте программу, проверяющую, можно ли из букв, входящих в А, составить В (буквы можно использовать не более одного раза и можно переставлять).

Например, А: ИНТЕГРАЛ; В: АГЕНТ — составить можно; В: ГРАФ —нельзя.

13).  Дана строка, содержащая текст на русском языке. Заменить все вхождения заданного слова на другое слово.

14).  С клавиатуры вводится предложение, слова в котором разделены символом ‘_’. Напечатать все предложения, которые получаются путем перестановки слов исходного текста.

15).  Дана строка, содержащая текст на русском языке. В предложениях некоторые из слов записаны подряд несколько раз (предложение заканчивается точкой или знаком восклицания). Отредактировать текст, удалив подряд идущие вхождения слов в предложениях.

16).  Дана строка, содержащая зашифрованный русский текст. Каждая буква заменяется на следующую за ней (буква я заменяется на а). Получить новую расшифрованную строку.

17).  Даны две строки f1 и f2- Строка f1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками препинания. Строка f2 содержит не более 30 слов, которые разделены запятыми. Эти слова образуют пары: каждое второе является синонимом первого. Заменить в строке f1 те слова, которые можно, их синонимами. Результат поместить в новую строку.

18).  В записке слова зашифрованы – каждое из них написано наоборот. Написать программу расшифровки текста.

19).  Зашифровать введенный текст, написав каждое слово наоборот.

20).  C клавиатуры вводится предложение, слова в котором разделены символом ‘_’ и маска (шаблон) для выбора из предложения нужных слов (содержит буквы и символ заполнителя *, который заменяет любое количество символов). Необходимо выбрать из предложения слова, которые подходят под маску (шаблон). Например:

ВЫРАЖЕНИЕ_ЕСТЬ_ПРАВИЛО

Маска *Н*Е ВЫРАЖЕНИЕ

*РА* ВЫРАЖЕНИЕ, ПРАВИЛО

21).  Выберите 10 произвольных букв русского алфавита. Введите произвольное слово. С помощью ключа длиной от 3 до 8 символов произведите шифровку слова в числовую комбинацию.

В Е Ж М Н О П Р С Т КЛЮЧ - 1234

8 9

МНОЖЕСТВО

5

1

 

6 - РЕЗУЛЬТАТ

23).  Зашифруйте вводимое с клавиатуры предложение следующим образом: сначала выбираются 2 слова из базы (набор слов, находящихся в тексте программы или вводимых с клавиатуры), затем слово из предложения, затем опять 2 слова из базы, после чего слово из предложения и так далее.

24).  С клавиатуры вводятся 4 массива слов:

- существительные в именительном падеже (тормоз, дисковод)

- глаголы (ест, сажает)

- качественные прилагательные во множественном числе (ядовитые, прекрасные)

- существительные в винительном падеже множ. числа (колонки, заборы).

Выбрать случайным образом слова из массивов и составить предложения.

ТОРМОЗ ЕСТ ПРЕКРАСНЫЕ ЗАБОРЫ.

4. Выполнить задание на применение регулярных выражений. Выбрать одно по заданному номеру.

1.  Задан текст. Определить входит ли в него заданное слово и сколько раз.

2.  Задан текст. Определить является ли он кодом HTML : содержит теги <html>, <form>, <h1>.

3.  Задан текст. Определить является ли он текстом на английском языке.

4.  Задан текст. После каждой буквы «о» вставить сочетание «Oк».

5.  Задан текст. Определить является ли он текстом на русском языке.

6.  Задан текст. Определить содержит ли он цифры.

7.  Задан текст. Определить сколько предложений начинается со слова “Информатика”.

8.  Задан текст. Выбрать из него все 7-значные номера телефонов.

9.  Задан текст. Определить содержит ли он цифры.

10.  Задан текст. Выбрать из него все e-mail адреса.

11.  Задан текст, содержащий буквы и цифры. Найти произведение все чисел в тексте.

12.  Задано предложение. Распечатать все слова в столбик.

13.  Задан текст. Определить количество согласных букв в нем и распечатать их.

Лабораторная работа 2

Тема: Структуры и перечисления как частные виды классов.

Классы. Интерфейсы

Цель работы:

-  Научиться создавать типы данных структуры и перечисление.

-  Изучить методы работы со структурами и перечислениями в программе на С#.

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

Теоретические сведения

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

[атрибуты][модификаторы]enum имя_перечисления[: базовый класс]

{список_возможных_значений}

Особенности объявления перечислений:

·  как и другие классы, перечисления могут быть объявлены непосредственно в пространстве имен проекта или могут быть вложены в описание класса. Последний вариант часто применяется, когда перечисление используется в одном классе и имеет атрибут доступа private;

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

·  константы могут задаваться словами русского языка;

·  разрешается задавать базовый класс перечисления.

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

Часто бывает удобным создать набор значимых имен, которые будут представлять числовые значения. Представим себе, что вы создаете систему расчета заработной платы для сотрудников. Скорее всего, вам покажется более удобным вместо значений {0, 1, 2, 3} использовать понятные имена VP, Manager, Grunt и Contractor. Создание перечисле­ния для наших целей может выглядеть так:

Значения по умолчанию:

еnиm ЕmрТуре {

Manager, // = 0

Grunt, // = 1

Contractor, // = 2

VP // = 3

}

При необходимости можно задать значения:

enum EmpType {

Manager = 102,

Grunt, // = 103

Contractor, // = 104

VP // = 105

}

Для элементов перечисления вовсе не обязательно использовать строго после­довательные числовые значения.

class EnumClass {

public static void AskForBonus(EmpType e) {

switch(e) {

case EmpType. Contractor:

Console. WriteLine(“You are already get enough cash..."); break;

case EmpType. Grunt:

Console. WriteLine("You havve got to be kidding..."); break;

case EmpType. Manager:

Console. WriteLine(“How about stock options instead?"); break;

case'EmpType. VP:

Console. WriteLine(“VERY GOOD. Sir!"); break;

default: break;

} }

public static int Main(string[] args) {

EmpType fred;

fred = EmpType. Contractor;

AskForBonus(fred);

return 0;

}}

Структуры С# можно рассматривать как особую разновидность классов. С классами структуры роднит многое: для структур можно определять конструк­торы (только с параметрами), структуры могут реализовывать интер­фейсы. Синтаксис объявления структуры аналогичен синтаксису объявления класса:

[атрибуты][модификаторы]struct имя_структуры [:список_интерфейсов]

{тело_структуры}

//Программа 1. Использование перечислений и структур в программах на C#

enum EmpType : byte {

Manager = 10,

Grunt = 1,

Contractor = 100,

VP = 9

}

struct Employee {

public EmpType title; // Одно из полей структуры – перечисление

public string name;

public short deptID:

}

class StructTester {

public static int Main(string[] args) {

Employee fred;

fred. deptID = 40;

fred. name = "Fred";

fred. title = EmpType. Grunt;

return 0;

}}

Для структур можно определить конструкторы, но все созданные вами конструкторы должны принимать параметры:

struct Employee {

public EmpType title;

public string name;

public short deptID;

// Конструктор

public Employee (EmpType et, string n, short d) {

title = et;

name = n;

deptID = d;

}}

При помощи такого определения структуры, в котором предусмотрен конструктор, можно создавать новых сотрудников следующим образом:

class StructTester {

public static int Main(string[] args) {

Employee maгу =new Employee (EmpType. VP, "Mary", 10);

return 0;

}}

Конечно же, структуры могут быть использованы в качестве принимаемых и возвращаемых методами параметров. Например, пусть в нашем классе StructTester будет предусмотрен метод DisplayEmpStats():

public void DisplayEmpStats (Employee e) {

Console. WriteLine(“Here is {0}\'s info:", e. name);

Console. WriteLine("Department ID: {0}", e. deptID);

Console. WriteLine(“Title: {0}", Enum. Format(typeof(EmpType), e. title, "G"));

}

Так можно выполнить программу с использованием DisplayEmpStats(). Выведем данные о Мэри и Фреде:

public static int Main(string[] args) {

StructTester t = new StructTester();

t. DisplayEmpStats(mary);

t.DisplayEmpStats(fred);

return 0;

}

Упаковка и распаковка — это наиболее удоб­ный способ преобразования структурного типа в ссылочный, и наоборот. Основное назначение структур — возможность получения некоторых преимуществ объектной ориентации, но при более высокой производительности за счет размещения в стеке. Чтобы преобразовать структуру в ссылку на объект, необходимо упако­вать ее экземпляр:

Employee stan = new Employee (EmpType. Grunt, "Stan", 10);

object stanlnBox = stan;

// можно распаковать и производить операции с содержимым

public void UnboxThisEmployee(object о) {

Employee temp = (Employee)o;

Console. WriteLine(temp. name + "is alive!");

}

Классы в C#

[атрибуты][модификаторы]class имя_класса [:список_родителей]

{тело_класса}

Возможными модификаторами в объявлении класса могут быть модификаторы new, abstract, sealed, которые связаны с наследованием, и четыре модификатора доступа, два из которых - private и protected - могут быть заданы только для вложенных классов. Обычно класс имеет атрибут доступа public, являющийся значением по умолчанию. Так что в простых случаях объявление класса выглядит так:

public class Employee {тело_класса}

В теле класса могут быть объявлены:

·  константы;

·  поля;

·  конструкторы и деструкторы;

·  методы;

·  события;

·  делегаты;

·  вложенные классы (структуры, интерфейсы, перечисления).

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

Члены классов С# и бывают следующих видов:

- Поле. Так называется член-переменная, содержащий некоторое значение. В ООП поля иногда называют данными объекта. К полю можно применять несколько модификаторов в зависимости от того, как вы собираетесь его использовать. В число модификаторов входят static, readonly и const.

- Метод. Это реальный код, воздействующий на данные объекта (или поля).

- Свойства. Их иногда называют «разумными» полями (smart fields), поскольку они на самом деле являются методами, которые клиенты класса воспринимают как поля. Это обеспечивает клиентам большую степень абстрагирования за счет того, что им не нужно знать, обращаются ли они к полю напрямую или через вызов метода-аксессора.

- Константы. Как можно предположить, исходя из имени, константа — это поле, значение которого изменить нельзя.

- Индексаторы. Если свойства — это «разумные» поля, то индексаторы —это «разумные» массивы, так как они позволяют индексировать объекты методами-аксессорами get и set. С помощью индексатора легко проиндексировать объект для установки или получения значений.

- События. Событие вызывает исполнение некоторого фрагмента кода. События — неотъемлемая часть программирования для Microsoft Windows. Например, события возникают при движении мыши, щелчке или изменении размеров окна.

class Employee {

// Внутренние закрытые данные класса

private string fullName;

private int empID;

private float currPay;

// Конструкторы

public Employee() {}

public Employee(string fullName, int empID, float currPay) {

this. fullName = fullName;

this. empID = empID;

this. currPay = currPay;

}

// Метод для увеличения зарплаты сотрудника

public void GiveBonus(float amount)

{ currPay += amount; }

// Метод для вывода сведений о текущем состоянии объекта

public virtual void DisplayStats() {

Console. WriteLine("Name: {0}", fullName):

Console. WriteLine(“Pay: {0}", currPay):

Console. WriteLine(“ID: {0}", empID);

}

}

public static void Main() {

Employee e = new Employee(“Joe", 80, 30000);

e. GiveBonus(200):

Employee e2:

e2 = new Employee("Beth", 81, 50000);

e2.GiveBonus(1000);

e2.DisplayStats():

}

Таблица 2.1 – Модификаторы доступа к членам классов

Модификатор доступа

Описание

public

Член доступен вне определения класса и иерархии производных классов.

protected

Член невидим за пределами класса, к нему могут обращаться только производные классы.

private

Член недоступен за пределами области видимости определяющего его класса. Поэтому доступа к этим членам нет даже у производных классов.

internal

Член видим только в пределах текущей единицы компиляции. Модификатор доступа internal в плане ограничения доступа является гибридом public и protected, зависимым от местоположения кода.

Методы-свойства

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9