Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_shpory_po_OOP_polnye.doc
Скачиваний:
6
Добавлен:
20.09.2019
Размер:
295.94 Кб
Скачать

5. Обобщенные методы. Объявление и детализация методов типами пользователя.

C# поддерживает обобщенные методы. Любое объявление метода внутри структуры, класса или интерфейса может быть сделано обобщенным. Сюда входят и статические, и виртуальные или абстрактные методы. К тому же можно объявлять обобщенные методы в необобщенных типах. Чтобы объявить обобщенный метод, просто необходимо добавить аргумент типа в список аргументов в конце имени метода, но перед списком его параметров. Можно объявить любые типы в списке параметров метода, включая и тип возврата метода, как обобщенные параметры.

Синтаксис объявления обобщённого метода:

[модификатор доступа] [тип возвращаемого значения] <имя метода> <список параметров типа> (список аргументов)

Пример вызова:

public void MyMethod<T> (T myVar)

{ T second Var = myVar; }

int a = 0;

obj.MyMethod(a); obj.MyMethod<int>(a);

6. Ограничения на параметры в обобщенных классах и функциях.

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

1) оператор default (<тип>) - он возвращает значения типа данных по умолчанию (для ссылочных типов – null, для типов значений - значения по умолчанию).

T myVar = default (T);

2) наложение ограничений на параметры обобщенного объекта (класса).

Ограничения накладываются с помощью ключевого слова where.

Public class MyGenericClass <T> where T: <ограничения>

Если нужно наложить ограничения на несколько параметров, то пишется where R<ограничения>

А если несколько ограничений на один параметр:

Where T : <ограничение>,<ограничение>

В качестве ограничений могут быть: 1. struct - значения типа или структура данных; 2. class - ссылочный тип. 3. Имя базового класса - параметр может быть базовым классом или производным от него. 4. Имя интерфейса - параметр может быть либо этим интерфейсом, либо наследуемым интерфейсом, либо любым классом, который реализует интерфейс. 5. New() - параметр должен быть классом, у которого есть пустой конструктор.

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

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

public delegate R Operation <T1, T2, R> (Tl vall, T2 val2)

where Tl: struct

where T2: struct

where R: struct;

public class EntryPoint

{

public static double Add( int vall, float val2 )

{ return vall + val2;}

public static void Main()

{

Operation<int, float, double> op =

new Operation<int, float, double>(EntryPoint.Add);

Console.WriteLine ("{0} + {1} = {2}", 1, 3.2, op(1, 3.2f));

}

}

7. Типы, допускающие значение null

Основная разница между типами значений и ссылочными типами состоит в том, что ссылочные типы могут иметь значение null (физически – 0). Существует много ситуаций, когда нужно, чтобы типы значений также имели значение null.

Nullable<int> a = null; // int ? a = null;

int b = 5; a = 2; int c = a+b;

Для типа bool? Существует таблица операций, значений и результатов. Существует операция ?? – бинарная операция: op1 ?? op2 – другая форма записи (op1 == null)?op2 : op1

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

Допускающий значение NULL тип может содержать значение или его значение может быть не определено. Оператор ?? определяет значение по умолчанию, которое будет возвращаться в том случае, если допускающему значение NULL типу будет присвоено любое другое значение. Если попытаться присвоить не допускающему значение NULL типу тип, допускающий значение NULL, без использования оператора ??, то будет сгенерирована ошибка времени компиляции. Если используется приведение типов и допускающий значение NULL тип в данный момент не определен, то будет выдано исключение InvalidOperationException. Явные преобразования. Допускающий значение NULL тип может быть приведен к обычному типу либо явным образом с помощью приведения, либо с помощью свойства Value. Пример: (int? n = null; int m2 = (int)n; int m3 = n.Value;). Если определенное пользователем преобразование определено между двумя типами данных, то это же преобразование может быть также использовано с допускающими значение NULL версиями этих типов данных. Неявные преобразования. Переменной допускающего значение NULL типа может быть присвоено значение NULL с помощью ключевого слова null: int? n1 = null; Преобразование из обычного типа в допускающий значение NULL является неявным (int? n2; n2 = 10;). Большинство обобщенных контейнеров находится в пространстве имен System.Collections.Generetic. При их использовании с типами значений можно получить существенно большую производительность, чем с общими списками (контейнерами). Это связано с тем, что при хранении типов значений в коллекции (обобщенной и обычной) применяются различные механизмы. При попытке разместить в обычном контейнере тип значения выполняется операция «упаковка объекта». Она заключается в создании объекта ссылочного типа, соответствующего типу значения, копирования значений в ссылочный объект и размещение объектов в контейнере. При обратной операции выполняется распаковка. В обобщенных контейнерах распаковки и упаковки не производятся.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]