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



ЗНАЕТЕ ЛИ ВЫ?

Ключевые слова «checked» и «unchecked»

Поиск

 

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

В С# допускается указывать, будет ли в коде сгенерировано исключение при переполнении, с помощью ключевых слов checked и unchecked. Так, если требуется указать, что выражение будет проверяться на переполнение, следует использовать ключевое слово checked, а если требуется проигнорировать переполнение — ключевое слово unchecked. В последнем случае результат усекается, чтобы не выйти за пределы диапазона представления чисел для целевого типа выражения.

 

У ключевого слова checked имеются две общие формы. В одной форме проверяется конкретное выражение, и поэтому она называется операторной. А в другой форме проверяется блок операторов, и поэтому она называется блочной. Ниже приведены обе формы:

 

checked (<выражение>)

checked

{

// Проверяемые операторы

}

 

Где выражение обозначает проверяемое выражение. Если вычисление проверяемого выражения приводит к переполнению, то генерируется исключение OverflowException.

 

У ключевого слова unchecked также имеются две общие формы. В первой, операторной форме переполнение игнорируется при вычислении конкретного выражения. А во второй, блочной форме оно игнорируется при выполнении блока операторов:

 

unchecked (<выражение>)

unchecked

{

// Операторы, для которых переполнение игнорируется

}

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

 

Проиллюстрируем вышесказанное примером:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

 

namespace LC_Console

{

class Program

{

static void Main()

{

byte a, b, result;

Console.Write("Введите количество опросов: ");

int i = int.Parse(Console.ReadLine());

 

for (int j = 1; j <= i; j++)

{

 

try

{

Console.Write("\nВведите a: ");

// Используем "unchecked" в одном выражении

a = unchecked((byte)int.Parse(Console.ReadLine()));

Console.Write("Введите b: ");

b = unchecked((byte)int.Parse(Console.ReadLine()));

// Используем "checked" для всего блока операторов

checked

{

result = (byte)(a + b);

Console.WriteLine("a + b = " + result);

result = (byte)(a * b);

Console.WriteLine("a * b = " + result + "\n");

}

}

catch (OverflowException)

{

Console.Write("Переполнение.\n\n");

}

}

Console.WriteLine("Для продолжения нажмите любую клавишу...");

Console.ReadKey();

}

}

}

 

Рис. 2. 1. Результат работы кода выше

 

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

Понятие «Делегат», «Лямбда-выражение» и «Событие»

Понятие «Делегат»

Понятие «Делегат»

 

Понятие «Делегат»

 

Делегат в C# представляет собой объект, который может ссылаться на мето д. Следовательно, когда создаётся делегат, то в итоге получается объект, содержащий ссылку на метод. Более того, метод можно вызывать по этой ссылке. Иными словами, делегат позволяет вызывать метод, на который он ссылается.

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

 

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

  • адрес метода, на котором он вызывается;
  • аргументы (если есть) этого метода;
  • возвращаемое значение (если есть) этого метода.

 

Как только делегат создан и снабжён необходимой информацией, он может динамически вызывать методы, на которые указывает, во время выполнения. Каждый делегат в .NET Framework (включая специальные делегаты) автоматически снабжается способностью вызывать свои методы синхронно или асинхронно. Этот факт значительно упрощает задачи программирования, поскольку позволяет вызывать метод во вторичном потоке выполнения без ручного создания и управления объектом Thread.

 

2. Определение типа делегата в С#

 

Тип делегата объявляется с помощью ключевого слова delegate. Ниже приведена общая форма объявления делегата:

 

delegate <возвращаемый тип> <имя делегата> (<список параметров>);

 

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

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

 

Рассмотрим конкретный пример:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

// Создаём делегат

delegate int IntOperation(int i, int j);

 

class Program

{

// Организуем ряд методов

static int Sum(int x, int y)

{

return x + y;

}

 

static int Prz(int x, int y)

{

return x * y;

}

 

static int Del(int x, int y)

{

return x / y;

}

 

static void Main()

{

// Сконструируем делегат

IntOperation op1 = new IntOperation(Sum);

 

int result = op1(5, 10);

Console.WriteLine("Сумма: " + result);

 

// Изменим ссылку на метод

op1 = new IntOperation(Prz);

result = op1(5, 10);

Console.WriteLine("Произведение: " + result);

Console.WriteLine("Для продолжения нажмите любую клавишу...");

Console.ReadKey();

}

}

}

/* Выведет:

* Сумма: 15

* Произведение: 50

* Для продолжения нажмите любую клавишу...

*/

 

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

 



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 380; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.25.34 (0.006 с.)