Разделы презентаций


Обобщения ( generics)

Содержание

Зачем нужны обобщения ( generics)? В библиотеке классов NET Framework 1.0 -1.1 классы-коллекции определены как состоящие из элементов типа Object. Две проблемы: операция упаковки (boxing) при добавлении в коллекцию элемента,

Слайды и текст этой презентации

Слайд 1Обобщения ( generics)
Обобщения – это классы, структуры, интерфейсы

и методы, в которых некоторые типы сами являются параметрами. Эти

типы перечисляются в списке параметров-типов(placeholders).
Синтаксически обобщения похожи на шаблоны в неуправляемом С++. Поддерживаются только версиями .NET Framework 2.0 и выше.
Определение обобщенного типа задает шаблон, в котором некоторые используемые типы являются параметрами и будут конкретизированы при создании объектов обобщенного типа.
Пример определения обобщенного типа

Создание объектов обобщенного типа

public class MyList {

}


MyList ms = new MyList () ;
MyList ms = new MyList () ;

Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются

Слайд 2Зачем нужны обобщения ( generics)?
В библиотеке классов NET Framework

1.0 -1.1 классы-коллекции определены как состоящие из элементов типа Object.


Две проблемы:
операция упаковки (boxing) при добавлении в коллекцию элемента, имеющего тип-значение.
невозможность проверить безопасность типа на стадии компиляции.
Зачем нужны обобщения ( generics)? В библиотеке классов NET Framework 1.0 -1.1 классы-коллекции определены как состоящие из

Слайд 3Обобщения и CLR
Синтаксически обобщения похожи на шаблоны в неуправляемом

С++, но компилируются в native-код в процессе выполнения приложения.
Обобщения (

generics) поддерживаются IL и CLR. Как и для обычных типов, код обобщенного типа компилируется в IL и информация об обобщенных параметрах размещается в метаданных.
В процессе компиляции IL-кода в команды процессора типовым параметрам присваиваются значения.
В случае, когда обобщенный параметр получает как значение ссылочный тип, используется один и тот же native код.
Для каждого типа-значения для обобщенного параметра , JIT-компилятор создает новый код, но не дублирует уже созданный.
Обобщения дают возможность создавать эффективный, безопасный с точки зрения использования типов код.
MSDN. Статья Juval Lowy “An Introduction to C# Generics”.
Обобщения и CLR Синтаксически обобщения похожи на шаблоны в неуправляемом С++, но компилируются в native-код в процессе

Слайд 4Обобщенные методы (generic methods)
class MyClass
{ T G(T arg) {...}
}
class

MyGenericClass
{ T M(T arg) {...}
}
Обобщенный метод может

использовать тип-параметр как тип возвращаемого значения или как тип одного из формальных параметров.
Обобщенный метод можно объявить как в обычном классе (структуре), так и в обобщенном классе (структуре).
Обобщенный метод - это метод со своим списком обобщенных параметров.
В приведенном примере только метод G() считается обобщенным:
Обобщенные методы (generic methods)class MyClass{  T G(T arg) {...}}class MyGenericClass {  T M(T arg) {...}}

Слайд 5Ограничения (constraints)
Можно указать ограничения для типов, которые могут быть

значениями обобщенных типов-параметров.
.NET Framework 2.0 и выше поддерживают следующие

ограничения:
тип должен реализовывать определенные интерфейсы;
тип должен иметь определенный базовый класс;
тип должен иметь конструктор без параметров (default ctor);
тип должен быть ссылочным типом или типом-значением.

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

Ограничения (constraints) Можно указать ограничения для типов, которые могут быть значениями обобщенных типов-параметров. .NET Framework 2.0 и

Слайд 6Ограничения (constraints) -2
Ограничения задаются с помощью ключевого слова where.

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

K, должен реализовывать интерфейс IComparable и иметь базовый класс MyBaseClass, а тип T – реализовывать интерфейсы IDisposable и ICloneable:

class MyGenericClass where K : MyBaseClass, IComparable where T : ICloneable, IDisposable
{...}

В списке ограничений можно указать только один базовый класс. Базовый класс должен быть указан первым ( до интерфейсов).
Обобщенный параметр можно использовать в ограничениях для другого параметра:

class MyGenericClass where K : T, IComparable {...}

Ограничения (constraints) -2 Ограничения задаются с помощью ключевого слова where. В следующем примере тип, который может быть

Слайд 7Ограничения (constraints) -3
В следующем примере тип K должен иметь

открытый конструктор без параметров:
class MyGenericClass where K : MyBaseClass,

new() where T : ICloneable, IDisposable
{...}

В следующем примере тип, который может быть значением параметра K, должен быть ссылочным типом, а для типа T – типом-значением:

class MyGenericClass where K : class, IDisposable where T : struct, IComparable
{...}

Ограничения (constraints) -3 В следующем примере тип K должен иметь открытый конструктор без параметров:class MyGenericClass 	where K

Слайд 8Обобщения и наследование
Если базовый класс является обобщенным типом, то

при определении производного класса
или обобщенный параметр базового класса

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

public class Base { . . . }
public class Derived : Base { . . . }
public class GenericDerived : Base { . . . }

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

public class Base where T : IDisposable { . . . }
public class Derived : Base where T : IDisposable
{ . . . }

Обобщения и наследование Если базовый класс является обобщенным типом, то при определении производного класса или обобщенный параметр

Слайд 9Обобщения и неявное приведение типов
Допускается неявное приведение обобщенного типа

к типу object;
к типу, возможность приведения к которому следует

из ограничений.


public class MyClass where T: MyBaseClass, IMyInterface
{
void MyMethod (T t)
{ object obj1 = t;
MyBaseClass obj2 = t;
IMyInterface obj3 = t;
. . .
}
. . .
}

Обобщения и неявное приведение типов Допускается неявное приведение обобщенного типа к типу object; к типу, возможность приведения

Слайд 10Обобщения и явное приведение типов
Допускается явное приведение обобщенного типа

к любому интерфейсу.
Не разрешено явное приведение к классу.

public class

MyClass where T: MyBaseClass, IMyInterface
{
void MyMethod (T t)
{ IComparable obj1 = (IComparable)t;
// string obj2 = (string)t;
. . .
}
. . .
}

Можно выполнить явное приведение T-> object -> string. При выполнении может быть брошено исключение.

Обобщения и явное приведение типов Допускается явное приведение обобщенного типа к любому интерфейсу. Не разрешено явное приведение

Слайд 11Обобщенные методы (generic methods)

class MyClass
{ T Method1(T arg)

{ return default(T); }
T Method2()
{

return default(T); }
}

Метод в обобщенном классе может иметь свои обобщенные параметры.
Свойства и индексаторы могут использовать только обобщенные параметры класса (структуры).
Если метод определяет свой обобщенный параметр, для него можно задать ограничения.
При вызове обобщенного метода можно не указывать явно тип обобщенного параметра, если компилятор может определить его по типу фактического параметра метода.


static void Main()
{ MyClass mc = new MyClass();
mc.Method1(123);
mc.Method1(“abc”);
mc.Method2();
}

Обобщенные методы (generic methods)class MyClass { T Method1(T arg)  { return default(T); } T Method2()

Слайд 12Оператор default
// При попытке выбрать элемент из пустого стека метод

Pop() не
// бросает исключение, а возвращает значение по умолчаню –

null
// для стека из строк и 0 для стека из целых чисел.
public class Stack
{ int m_StackPointer = 0;
[…….код C# ]
public T Pop()
{ […….код C# ]
if(m_StackPointer == 0) return default(T);
}
}

Оператор default(T) возвращает значение по умолчанию для типа:
null - для ссылочных типов;
0 - для отдельных типов-значений (int, double,..);
для структур (struct) всем полям присваиваются значения 0 или null, в зависимости от того, какой тип имеет поле – тип-значение или ссылочный тип.

Оператор default// При попытке выбрать элемент из пустого стека метод Pop() не// бросает исключение, а возвращает значение

Слайд 13Типы, принимающие значение null
В приложениях, работающих с базами данных,

переменные могут находиться в “неопределенном” состоянии. Для ссылочных типов –

это значение null.
В .NET Framework 2.0 и выше добавлена поддержка nulI для типов-значений с помощью обобщенного типа System.Nullable.

public struct Nullable where T : struct
{ public Nullable (T value) ;
public bool HasValue { get; }
public T Value { get; }
public T GetValueOrDefault ();
public T GetValueOrDefault ( T defaultValue );
public static explicit operator T (Nullable value);
public static implicit operator Nullable (T value);
}

Два способа объявления nullable переменной:
System.Nullable variable;
T? variable;

Типы, принимающие значение null В приложениях, работающих с базами данных, переменные могут находиться в “неопределенном” состоянии. Для

Слайд 14System.Nullable
Для System.Nullable поддерживается троичная логика:

System.Nullable Для System.Nullable поддерживается троичная логика:

Слайд 15Статические обобщенные методы в System.Array
создание read-only оболочки для массива

;
преобразование массива одного типа в массив другого типа;
бинарный

поиск ( 4 перегрузки);
поиск элемента, совпадающего с заданным объектом;
поиск элементов массива, для которых выполняются условия, определенные в предикате;
сортировка массива ( 9 перегрузок).

public static ReadOnlyCollection AsReadOnly ( T[] array )

// Изменение числа элементов в массиве
public static void Resize ( ref T[] array, int newSize) ;

// Создание read-only оболочки для массива
public static ReadOnlyCollection AsReadOnly( T[] array );

// Преобразование массива с элементами типа TInput в массив
// с элементами типа TOutput
public static TOutput[] ConvertAll ( TInput[] array, Converter converter ) ;

Статические обобщенные методы в System.Array создание read-only оболочки для массива ; преобразование массива одного типа в массив

Слайд 16Обобщенный интерфейс IComparable
Интерфейс IСomparable и обобщенный интерфейс IComparable определены

в пространстве имен System
public interface IСomparable
{int CompareTo ( Object obj

);
}
public interface IComparable
{int CompareTo( T other );
}

Интерфейс IСomparable используется при сортировке ArrayList. Обобщенный интерфейс IComparable используется при сортировке массивов в статических методах Sort из класса System.Array.

Обобщенный интерфейс IComparable Интерфейс IСomparable и обобщенный интерфейс IComparable определены в пространстве имен Systempublic interface IСomparable{int CompareTo

Слайд 17Обобщенные интерфейсы в BCL
Следующие обобщенные интерфейсы определены в пространстве

имен System.Collections.Generic.
public interface IEnumerable : IEnumerable
{ IEnumerator GetEnumerator ();}

public interface

IEnumerator : IDisposable, IEnumerator
{ T Current { get; } }

public interface IComparer
{ int Compare ( T x, T y );}

public interface IEqualityComparer
{ bool Equals ( T x, T y );
int GetHashCode (T obj);
}
Обобщенные интерфейсы в BCL Следующие обобщенные интерфейсы определены в пространстве имен System.Collections.Generic.public interface IEnumerable : IEnumerable{	IEnumerator GetEnumerator

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика