Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемМаргарита Часоводова
1 Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются в списке параметров-типов(placeholders). Синтаксически обобщения похожи на шаблоны в неуправляемом С++. Поддерживаются только версиями.NET Framework 2.0 и выше. Определение обобщенного типа задает шаблон, в котором некоторые используемые типы являются параметрами и будут конкретизированы при создании объектов обобщенного типа. Пример определения обобщенного типа Создание объектов обобщенного типа public class MyList { … } MyList ms = new MyList () ;
2 Зачем нужны обобщения ( generics)? В библиотеке классов NET Framework классы-коллекции определены как состоящие из элементов типа Object. Две проблемы: операция упаковки (boxing) при добавлении в коллекцию элемента, имеющего тип-значение. невозможность проверить безопасность типа на стадии компиляции.
3 Обобщения и CLR Синтаксически обобщения похожи на шаблоны в неуправляемом С++, но компилируются в native-код в процессе выполнения приложения. Обобщения ( generics) поддерживаются IL и CLR. Как и для обычных типов, код обобщенного типа компилируется в IL и информация об обобщенных параметрах размещается в метаданных. В процессе компиляции IL-кода в команды процессора типовым параметрам присваиваются значения. В случае, когда обобщенный параметр получает как значение ссылочный тип, используется один и тот же native код. Для каждого типа-значения для обобщенного параметра, JIT- компилятор создает новый код, но не дублирует уже созданный. Обобщения дают возможность создавать эффективный, безопасный с точки зрения использования типов код. MSDN. Статья Juval Lowy An Introduction to C# Generics.
4 Обобщенные методы (generic methods) class MyClass { T G (T arg) {...} } class MyGenericClass { T M(T arg) {...} } Обобщенный метод может использовать тип-параметр как тип возвращаемого значения или как тип одного из формальных параметров. Обобщенный метод можно объявить как в обычном классе (структуре), так и в обобщенном классе (структуре). Обобщенный метод - это метод со своим списком обобщенных параметров. В приведенном примере только метод G() считается обобщенным:
5 Ограничения (constraints) Можно указать ограничения для типов, которые могут быть значениями обобщенных типов-параметров..NET Framework 2.0 и выше поддерживают следующие ограничения: тип должен реализовывать определенные интерфейсы; тип должен иметь определенный базовый класс; тип должен иметь конструктор без параметров (default ctor); тип должен быть ссылочным типом или типом-значением. Информация об ограничениях хранится в метаданных и используется JIT-компилятором.
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 {...}
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 {...}
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;... }... }
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 (); }
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, в зависимости от того, какой тип имеет поле – тип-значение или ссылочный тип.
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;
14 System.Nullable Для System.Nullable поддерживается троичная логика: Xyx&yx|y true false true null true falsetruefalsetrue false nullfalsenull truenulltrue nullfalse null
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 ) ;
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.
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); }
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.