С#. Escape -последовательности. Пример использования



Escape последовательность c# выражает символы, которые не могут быть выражены или интерпретированы буквально. В Escape последовательностях перед символом следует символ обратного слеша, что предает данному символу особенного значения. Пример:

View source

Print ?

1.char newLine = '\n';

2.

3.char backslash = '\\';

 

35. С#. Операции уменьшения, увеличения, операции условия. Пример

 

 

С#. Логические операции. Пример

Как и в других C-подобных языках, в C# существуют следующие логические операторы (см. таблицу 2):

Таблица 2 Логические операторы C#

Оператор Описание Пример
&& Логическое И. Результат равен true, только если оба операнда равны true (x==8) && (y==5)
|| Логическое ИЛИ. Результат равен false, только если оба операнда равны false (y>8) || (y<5)
! Отрицание. Изменяет логическое значение на противоположное if(!(a==b))...

1. Все эти операторы возвращают результат типа bool.

2. Для знака == («равно») существует парный знак != («не равно»). Так, приведенный выше пример для оператора ! можно переписать так:

3. if(!(a==b))...

4. В C#, в отличии от многих других языков программирования, нельзя вместо false использовать 0, а вместо true - любое ненулевое число. Так, следующий фрагмент содержит ошибку:

5.   int k;

6.   ...

7.   If (k) //Ошибка!

8.   ...

 

С#. Типы данных. Приведение типов

Язык Си шарп имеет отдельный класс, который вызывает методы, для преобразование типов данный. Этот класс называется: Convert. Давайте рассмотрим эти преобразование типов данных: Преобразование в плавающей точкой в целое число: int i = Convert.ToInt32(14.56); // обратите внимание на то, что округление идет к большему числу, т.е. получится 15!!! Преобразование с целого числа в дробное или в число с плавающей точкой: double d = Convert.ToDouble(14); Преобразование с числа в строку (число может быть любым: дробным или целым): string s = Convert.ToString(14.456); Преобразование с целого числа в символ АСКИ кода: char s = Convert.ToChar(76); Интересно получается следующая запись: char s = Convert.ToChar(76.8); В данном случае ошибки синтаксической не будет, но при запуске программа выведет исключение, что "недопустимое приведение double к char". Поэтому нужно писать целые числа.

 

Массивы

Массивы в C# несколько отличаются от других C-подобных языков.

Пример первый:

...

int[] k;                                         //k - массив

k=newint [3];                             //Определяем массив из 3-х целых

k[0]=-5; k[1]=4; k[2]=55; //Задаем элементы массива

//Выводим третий элемент массива

Console.WriteLine(k[2].ToString());

...

Смысл приведенного фрагмента ясен из комментариев. Обратите внимание на некоторые особенности. Во-первых, массив определяется именно как

int[] k;

а не как один из следующих вариантов:

int k[]; //Неверно!

int k[3]; //Неверно!

int[3] k; //Неверно!

Во-вторых, так как массив представляет из себя ссылочный объект, то для создания массива необходима строка

k=newint [3];

Именно в ней мы и определяем размер массива. Хотя, вообще говоря, возможны конструкции вида

int[] k = newint [3];

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

int[] k = {-5, 4, 55};

Разумеется, приведенные конструкции применимы не только к типу int и не только к массиву размера 3.

В C#, как и в C/C++, нумерация элементов массива идет с нуля. Таким образом в нашем примере начальный элемент массива - это k[0], а последний - k[2]. Элемента k[3], разумеется, нет.

Теперь переходим к многомерным массивам. Вот так задается двумерный массив:

int[,] k = newint [2,3];

Обратите внимание, что пара квадратных скобок только одна. Естественно, что в нашем примере у массива 6 (=2*3) элементов (k[0,0] - первый, k[1,2] - последний).

Аналогично мы можем задавать многомерные массивы. Вот пример трехмерного массива:

int[,,] k = newint [10,10,10];

А вот так можно сразу инициализировать многомерные массивы:

int[,] k = {{2,-2},{3,-22},{0,4}};

 

Приведенные выше примеры многомерных массивов называются прямоугольными. Если их представить в виде таблицы (в двумерном случае), то массив будет представлять из себя прямоугольник.

Наряду с прямоугольными массивами существуют так называемые ступенчатые. Вот пример:

//Объявляем 2-мерный ступенчатый массив

Int [][ ] k = newint [2][ ];

//Объявляем 0-й элемент нашего ступенчатого массива

//Это опять массив и в нем 3 элемента

k[0]=newint[3];

//Объявляем 1-й элемент нашего ступенчатого массива

//Это опять массив и в нем 4 элемента

k[1]=newint[4];

k[1][3]=22; //записываем 22 в последний элемент массива

...

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

Самая важная и интересная возможность у ступенчатых массивов - это их "непрямоугольность". Так, в приведенном выше примере в первой "строке" массива k три целых числа, а во второй - четыре. Часто это оказывается очень к месту.

 

39. С#. Применение операторов if … else Пример

В инструкцию if-else, если condition имеет значение true, then-statement. Если condition, то значение else-statement. Поскольку condition не может быть одновременно имеет значение true, а значение, then-statement и else-statement выписки if-else никогда не могут выполнять оба.После запуска then-statement или else-statement, элемент управления передаются в следующую инструкцию после выписки if.

В инструкцию if, не включающую формулировку else, если condition имеет значение true, то then-statement. Если значение condition, то элемент управления передаются в следующую инструкцию после выписки if.

then-statement и else-statement могут состоять из одной или нескольких выписки выписки, заключенных в фигурные скобки ({}). Для одной выписки фигурные скобки необязательно но рекомендуется.

Выписка или выписки в then-statement и else-statement могут быть любого типа, включая другую оператора if, вложенных в исходной выписки if.Во вложенных выписках if, каждое предложение else принадлежит к последнему if, не имеет соответствующий объект else. В следующем примереResult1 возникает, если m > 10 и n > 20 возвращается значение true. Если m > 10 имеет значение true, а значение n > 20 - Result2.

 

Операторы switch.. case

If служит для разветвления программы на два направления. Если некоторое условие выполняется, то программа идет в одну сторону, если не выполняется - то в другую. Вот сразу пример, определяющий, четное или нечетное число ввел пользователь:

...

class Class1

{

   ...

   staticvoid Main(string[] args)

   {

       int k = Int32.Parse(Console.ReadLine());

       if (k%2==0)

       {

           Console.WriteLine(" Четное число ");

       }

       else

       {

           Console.WriteLine(" Нечетное число ");

      }

       Console.ReadLine();

   }

}

Как и в других C-подобных языках, фигурные скобки можно не писать в случае одного оператора. Также написание ветви else тоже не является необходимым - все зависит от конкретной задачи.

 

Оператор switch примеряется тогда, когда программа должна разделится более чем на два направления.

Вот пример:

       int k = Int32.Parse(Console.ReadLine());

       Console.WriteLine(k.ToString());

       switch (k){

           case 1:

           case 2:

               Console.WriteLine("Неудовлетворительно");

               break;

           case 3:

               Console.WriteLine("Удовлетворительно");

               break;

           case 4:

               Console.WriteLine("Хорошо");

               break;

           case 5:

               Console.WriteLine("Отлично");

               break;

           default:

               Console.WriteLine("Ошибка");

               break;

       }

В приведенном примере в зависимости от введенного пользователем числа на экран выводится та или иная оценка. Если число k не лежит в промежутке от 1 до 5, то выполняются операторы в ветке default и выводится надпись "Ошибка". Ветка default не обязательна. Обратите внимание на оператор break. Если его не написать, то будут выполнятmся операторы из следующей ветки case до строки с break'ом (т. е. в данном примере если пользователь введет 1 или 2, то программы выведет "Неудовлетворительно"). Обратите внимание, что если в некоторой ветке case или default есть операторы, то написание break обязательно. Так, в следующих двух фрагментах кода есть ошибки:

...

case 1:

   Console.WriteLine("Совсем неудовлетворительно");

   //Ошибка! Тут пропущен break

case 2:

   Console.WriteLine("Неудовлетворительно");

   break;

...

...

default:

   Console.WriteLine("...");

   //Ошибка! Тут пропущен break

}

Операторы циклов. Пример

Циклы в программировании используются очень часто, и знать их - это святое дело каждого программиста. Циклы бывают: с постусловием, с предусловием, конечные, бесконечные. В C# к примеру циклы объявляются так: Цикл for: for (int i = 0; i < 8; i++) { действие } Цикл while: while (sum != 0) { действие } Цикл do while: do { действие } while (sum != 0); И вот новый вид записи цикла - это foreach. К примеру у вас есть массив mas типа int и переменная s типа strng, тогда: foreach (int j in mas) { s = s + j + " "; } Пример программы с использованием циклов в Си Шарп:

 using System; using System.Collections.Generic; using System.Linq;

 using System.Text;

 namespace ConsoleApplication2

 {

class Program

{

static void Main(string[] args)

{

int[] mas = {1,2,5,6,8,4,9,10};

int i;

string s = "Вывод циклом for: ";

for (i = 0; i < 8; i++) { s = s + mas[i] + " ";

 }

 

Console.WriteLine(s);

s = "Вывод циклом while: ";

i = 0;

while (i < mas.Length)

{

s = s + mas[i] + " ";

i++;

}

Console.WriteLine(s);

s = "Вывод циклом do while: ";

i = 0;

do

{

s = s + mas[i] + " ";

i++;

}

while (i < mas.Length);

Console.WriteLine(s);

s = "Вывод циклом forech: ";

foreach (int j in mas)

{

s = s + j + " ";

} Console.WriteLine(s);

Console.ReadKey();

}

}

 }

 

42. С#. Операторы прерывания выполнения блока. Пример

43 С#. Классы для работы со строками. Пример

Строки в Си-шарп - это объекты класса String, значением которых является текст. Для работы со строками в этом классе определено множество методов (функций) и в этом уроке мы рассмотрим некоторые из них.

Чтобы использовать строку, ее нужно сначала создать – присвоить какое-либо значение, иначе мы получим ошибку: "Использование локальной переменной "[имя переменной]", которой не присвоено значение". Объявим простую строку и выведем ее на экран:

 

static void Main(string[] args)
{
string s = "Hello, World!";
Console.WriteLine(s);
}

 

static void Main(string[] args)
{
string s;
Console.WriteLine(s); // ошибка, строка не создана
}


Для объединения (конкатенации) строк используется оператор "+".

string s = "Hello," + " World!";

Оператор "[]" используется для доступа (только чтение) к символу строки по индексу:

string s = "Hello, World!";
char c = s[1]; // 'e'

Свойство Length возвращает длину строки.

Спецсимволы

Символ "\" является служебным, поэтому, чтобы использовать символ обратного слэша необходимо указывать его дважды "\\".

Символ табуляции – "\t"
Символ перевода строки – "\r\n"
Двойные кавычки – "\""

Методы (функции) класса String для работы со строками в Си-шарп

Как проверить, пуста ли строка?

Метод IsNullOrEmpty() возвращает True, если значение строки равно null, либо когда она пуста (значение равно ""):

 

static void Main(string[] args)
{
string s1 = null, s2 = "", s3 = "Hello";
String.IsNullOrEmpty(s1); // True
String.IsNullOrEmpty(s2); // True
String.IsNullOrEmpty(s3); // False
}


Метод IsNullOrWhiteSpace() работает как и метод IsNullOrEmpty(), только возвращает True еще и тогда, когда строка представляет собой набор символов пробела и/или табуляции ("\t"):

 

static void Main(string[] args)
{
string s1 = null, s2 = "\t", s3 = " ", s4 = "Hello";
String.IsNullOrWhiteSpace(s1); // True
String.IsNullOrWhiteSpace(s2); // True
String.IsNullOrWhiteSpace(s3); // True
String.IsNullOrWhiteSpace(s4); // False
}


Как проверить, является ли одна строка "больше" другой?

Для сравнивания строк используется метод Compare(). Суть сравнения строк состоит в том, что проверяется их отношение относительно алфавита. Строка "a" "меньше" строки "b", "bb" "больше" строки "ba". Если обе строки равны, метод возвращает "0", если первая строка меньше второй – "-1", если первая больше второй – "1":

 

static void Main(string[] args)
{
String.Compare("a", "b"); // возвращает -1
String.Compare("a", "a"); // возвращает 0
String.Compare("b", "a"); // возвращает 1
String.Compare("ab", "abc"); // возвращает -1
String.Compare("Romania", "Russia"); // возвращает -1
String.Compare("Rwanda", "Russia"); // возвращает 1
String.Compare("Rwanda", "Romania"); // возвращает 1
}


Чтобы игнорировать регистр букв, в метод нужно передать, как третий аргумент true.

String.Compare("ab", "Ab"); // возвращает -1
String.Compare("ab", "Ab", true); // возвращает 0

Как перевести всю строку в верхний/нижний регистр?

Для этого используются методы ToUpper() и ToLower():

 

static void Main(string[] args)
{
string s = "Hello, World";
Console.WriteLine(s.ToUpper()); // выводит "HELLO, WORLD"
Console.WriteLine(s.ToLower()); // выводит "hello, world"
Console.ReadLine();
}


Как проверить, содержит ли строка подстроку?

Для проверки содержания подстроки строкой используется метод Contains(). Данный метод принимает один аргумент – подстроку. Возвращает True, если строка содержит подстроку, в противном случае – False. Пример:

 

static void Main(string[] args)
{
string s = "Hello, World";

if (s.Contains("Hello"))
Console.WriteLine("Содержит");
Console.ReadLine();
}


Данная программа выводит слово "Содержит", так как "Hello, World" содержит подстроку "Hello".

Как найти индекс первого символа подстроки, которую содержит строка?

Метод IndexOf() возвращает индекс первого символа подстроки, которую содержит строка. Данный метод принимает один аргумент – подстроку. Если строка не содержит подстроки, метод возвращает "-1". Пример:

 

static void Main(string[] args)
{
string s = "Hello, World";
Console.WriteLine(s.IndexOf("H")); // 0
Console.WriteLine(s.IndexOf("World")); // 7
Console.WriteLine(s.IndexOf("Zoo")); // -1
Console.ReadLine();
}


Как узнать, начинается/заканчивается ли строка указанной подстрокой?

Для этого используются соответственно методы StartsWith() и EndsWith(), которые возвращают логическое значение. Пример:

 

static void Main(string[] args)
{
string s = "Hello, World";
Console.WriteLine(s.StartsWith("Hello")); // True
Console.WriteLine(s.StartsWith("World")); // False
Console.WriteLine(s.EndsWith("World")); // True
Console.ReadLine();
}


Как вставить подстроку в строку, начиная с указанной позиции?

Метод Insert() используется для вставки подстроки в строку, начиная с указанной позиции. Данный метод принимает два аргумента – позиция и подстрока. Пример:

 

static void Main(string[] args)
{
string s = "Hello World";
Console.WriteLine(s.Insert(5,",")); // вставляет запятую на 5 позицию
Console.ReadLine();
}


Как обрезать строку, начиная с указанной позиции?

Метод Remove() принимает один аргумент – позиция, начиная с которой обрезается строка:

 

static void Main(string[] args)
{
string s = "Hello, World";
Console.WriteLine(s.Remove(5)); // удаляем все символы, начиная с 5 позиции, на экран выведется "Hello"
Console.ReadLine();
}


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

Как получить подстроку из строки, начиная с указанной позиции?

Для этого используется метод Substring(). Он принимает один аргумент – позиция, с короторой будет начинаться новая подстрока:

 

static void Main(string[] args)
{
string s = "Hello, World";
Console.WriteLine(s.Substring(7)); // получаем строку начиная с 7 позиции, выведет "World"
Console.ReadLine();
}


В метод Substring(), как в метод Remove() можно передать и второй аргумент – длина подстроки. Substring (3, 5) – возвратит подстроку длиной в 5 символов начиная с 3-й позиции строки.

Как заменить в строке все подстроки указанной новой подстрокой?

Метод Replace() принимает два аргумента – подстрока, которую нужно заменить и новая подстрока, на которую будет заменена первая:

 

static void Main(string[] args)
{
string s = "Hello, World, Hello";
Console.WriteLine(s.Replace("Hello", "World")); //выведет "World, World, World"
Console.ReadLine();
}


Как преобразовать строку в массив символов?

Метод ToCharArray() возвращает массив символов указанной строки:

 

static void Main(string[] args)
{
string s = "Hello, World";
char[] array = s.ToCharArray(); // элементы массива – 'H', 'e', 'l', 'l'…
}


Как разбить строку по указанному символу на массив подстрок?

Метод Split() принимает один аргумент - символ, по которому будет разбита строка. Возвращает массив строк. Пример:

 

static void Main(string[] args)
{
string s = "Arsenal,Milan,Real Madrid,Barcelona";
string[] array = s.Split(','); // элементы массива – "Arsenal", "Milan", "Real Madrid", "Barcelona"
}


Неизменяемые строки

Стоит знать, что объекты класса String представляют собой неизменяемые (Immutable) последовательности символов Unicode. Когда вы используете любой метод по изменению строки (например Replace()), он возвращает новую измененную копию строки, исходные же строки остаются неизменными. Так сделано потому, что операция создания новой строки гораздо менее затратна, чем операции копирования и сравнения, что повышает скорость работы программы. В Си-шарп также есть классStringBuilder, который позволяет изменять строки. Об особенностях работы с ним мы поговорим в одном из дальнейших уроков.

 

44. регулярные выражения

Регулярные выражения предназначены для обработки текстовой информации и обеспечивают:

  • эффективный поиск в тексте по заданному шаблону;
  • редактирование, замену и удаление подстрок;
  • формирование итоговых отчетов по результатам работы с текстом.

С помощью регулярных выражений удобно обрабатывать, например, файлы в фор­мате HTML, файлы журналов или длинные текстовые файлы. Для поддержки регулярных выражений в библиотеку .NET включены классы, объединенные в пространство имен System.Text.RegularExpressions.

Основа работы с регулярными выражениями в C# построена в основном на классе Regex, располагающемся в пространстве имен System.Text.RegularExpressions. Впрочем, разбор теория не является целью данной статьи, так что давайте сразу же перейдем к практическому примеру, чтобы понять как все работает на самом деле.

static void Main(string[] args)

{

Console.WriteLine("Работа с регулярными выражениями");

Console.WriteLine("Введите строку и нажмите Enter");

string ip = Console.ReadLine();

string pattern = @"\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?";

Regex regex = new Regex(pattern);

Match match = regex.Match(ip);

while (match.Success)

{

   Console.WriteLine("IP-адрес был найден. Позиция {0},

    значение {1}", match.Index, match.Value);

     match = match.NextMatch();

}

}

В целом данный пример повторяет аналогичный, описанный Треем Нэшем в своей книге C# 2008. Описать его достаточно просто. В самом начале мы должны ввести простую строку, на которую и будет применено наше регулярное выражение. Строка будет называться ip по той простой причине, что мы будем проверять ее на нахождение в ней ip-адреса. После того, как мы получаем в ip значение, следует следующий код, в котором мы просто присваиваем строке pattern наше регулярное выражение, которое должно находить ip-адрес (о символах в этом коде будет сказано немного позднее). Затем с помощью Regex.Match применяем к строке ip регулярное выражение и получаем значения. В цикле просматриваем все эти значения, получая номер символа, в котором начинается ip-адрес и само значение (вполне нормальной окажется ситуация, когда в строке ip будет несколько адресов). С помощью match.NextMatch мы, собственно, и будем переходить к следующим адресам, если они присутствуют в результирующем наборе.

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

\b – когда используется в квадратных скобках, то означает обратную косую черту

\t – символ табуляции

\r – символ возврата каретки

\n –новая строка

\e – символ escape

. – любой символ за исключением конца строки

[abd] – в квадратных скобках может идти любой из символов, находящихся в них

[^abd] – а здесь, наоборот, должен идти символ, который не присутствует в скобках

[0-9a-fA-F] – символы могут идти в диапазоне. Например, от 0 до 9 может быть представлена любая цифра в этом промежутке

\w – большие и маленькие латинские буквы, цифры, знак подчеркивания

\s – пробел

\d – любая цифра

*- итерация. Например, \d* будет означать любое количество цифр, идущих подряд

+ - положительная итерация;

? – ноль или одно соответствие. Например, может быть вхождение цифры, а может и не быть

{n} – точное количество соответствий

{n,} – по меньшей мере, n соответствий

{n,m} – от n до m соответствий

() – разбитие регулярных выражений на группы

Теперь давайте попробуем сгруппировать наш ip-адрес. Вновь обратимся к примеру Трея Неша. В нем он несколько разделил ip-адрес на части, сделаем это также (здесь главное не практическая польза, а просто показать, каким образом работают группы в регулярных выражениях через C#):

static void Main(string[] args)

{

Console.WriteLine("Работа с регулярными выражениями");

Console.WriteLine("Введите строку и нажмите Enter");

string ip = Console.ReadLine();

string pattern = @"([01]?\d\d?|2[0-4]\d|25[0-5])\." +

                @"([01]?\d\d?|2[0-4]\d|25[0-5])\." +

                @"([01]?\d\d?|2[0-4]\d|25[0-5])\." +

                @"([01]?\d\d?|2[0-4]\d|25[0-5])";

Regex regex = new Regex(pattern);

Match match = regex.Match(ip);

while (match.Success)

{

    Console.WriteLine("IP-адрес был найден. Позиция {0},

     значение {1}", match.Index, match.Value);

    Console.WriteLine("Группы:");

    foreach (Group g in match.Groups)

    {

          Console.WriteLine("\t{0} в позиции {1}",

                           g.Value, g.Index);

    }

    match = match.NextMatch();

}

}

 

45. классы

 

 Класс — это логическая структура, позволяющая создавать свои собственные пользовательские типы путем группирования переменных других типов, методов и событий. Класс подобен чертежу. Он определяет данные и поведение типа. Если класс не объявлен статическим, то клиентский код может его использовать, создав объекты или экземпляры, назначенные переменной. Переменная остается в памяти, пока все ссылки на нее не выйдут из области видимости. В это время среда CLR помечает ее пригодной для сборщика мусора. Если класс объявляется статическим, то в памяти остается только одна копия и клиентский код может получить к ней доступ только посредством самого класса, а не переменной экземпляра. Для получения дополнительной информации см. Статические классы и члены статических классов (Руководство по программированию в C#).

В отличие от структур классы поддерживают наследование, фундаментальную характеристику объектно-ориентированного программирования. Для получения дополнительной информации см. Наследование (Руководство по программированию на C#).

Объявление классов

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

C#

 

public class Customer

{

//Fields, properties, methods and events go here...

}

 

 

Ключевому слову class предшествует уровень доступа. Поскольку в данном случае используется public, любой может создавать объекты из этого класса. Имя класса указывается после ключевого слова class. Оставшаяся часть определения является телом класса, в котором задаются данные и поведение. Поля, свойства, методы и события в классе обозначаются термином члены класса.

 

 

46. интерфейсы, делегаты, события

В C# для полного отделения структуры класса от его реализации используется механизм интерфейсов. Интерфейс является расширением идеи абстрактных классов и методов.

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

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

Синтаксис:

[атрибуты] [модификаторы] interface Имя_интерфейса[:список_родительских_интерфейсов] {

обьявление_свойств_и_методов}

Пример:

class Animal

{

public string Name;

private int Weight;

protected int Type;

public int Animal(int W, int T, string N)

{

Weight=W;

Type=T;

Name=N;

}

public int GetWeight(){return Weight;}

}

 

 

interface Species

{

string Species();

void Feed();

}

class Cheetah:Animal,Species

{

private string ScientificName;

public string Species()

{

return ScientificName;

}

public void Feed()

{Weight++;}

}

Можно объявлять ссылочную переменную, имеющую интерфейсный

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

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

Делегаты

 

Делегат — это объект, имеющий ссылку на метод. Делегат позволяет выбрать вызываемый метод во время выполнения программы. Фактически значение делегата – это адрес области памяти, где находится точка входа метода.

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

Делегат объявляется с помощью ключевого слова delegate, за которым

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

вызываемых методов.

Синтаксис:

delegate тип_возвращаемого_значения имя_делегата (список_параметров);

 

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

Метод можно вызвать только тогда, когда его подпись соответствует подписи делегата.

 

Событие — это автоматическое извещение о каком-либо роизошедшем

действии. События являются членами класса и объявляются с использованием ключевого слова event. Механизм событий основан на использовании делегатов.

Синтаксис: event имя_делегата имя_обьекта;

Широковещательные события

События могут активизировать несколько обработчиков, в том числе те, что определены в других объектах. Такие события называются широковещательными. Широковещательные события создаются на основе многоадресных делегатов.

Пример:

// Объявление делегата, на основе которого будет определено событие.

delegate void MyEventHandler () ;

 

// Объявление класса, в котором инициируется событие.

class MyEvent

{

public event MyEventHandler activate;

// В этом методе инициируется событие.

public void fire()

{ if (activate != null) activate();

}

class X

{

public void Xhandler()

{

Console.WriteLine("Событие получено объектом класса X.");

}

}

class Y

{

public void Yhandler()

{

Console.WriteLine("Событие получено объектом

класса Y.");

}

}

class EventDemo

{

static void handler()

{

Console.WriteLine("Событие получено объектом

класса EventDemo.")

}

public static void Main()

{

MyEvent evt = new MyEvent();

X xOb = new X();

Y yOb = new Y();

// Добавление методов handler (), Xhandler()

// и Yhandler() в цепочку обработчиков события.

evt.activate += new MyEventHandler(handler);

evt.activate += new MyEventHandler(xOb.Xhandler);

evt.activate += new MyEventHandler(yOb.Yhandler);

evt.fire();

Console.WriteLine();

evt.activate -= new MyEventHandler(xOb.Xhandler);

evt.fire();

}

}

 

 


Дата добавления: 2019-02-12; просмотров: 858; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!