Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
C#. Обобщения: понятие и синтаксис. Ограничения обобщений.
Понятие Обобщение (generic) — механизм, поддерживающий повторное использование алгоритмов Поддерживаются: обобщение типов (кроме перечислений) обобщение интерфейсов обобщение методов Обобщение типа class ИмяКласса<ПараметрТип> { // определение класса // ПараметрТип указывается везде, // где используется соответствующий тип // данных } Обобщение типа — пример interface ICacheProvider<T> { void Store(string key, T o); T Load(string key); } class MemoryCacheProvider<T> : ICacheProvider<T> { private Dictionary<string, T> cache = new Dictionary<string, T>(); public void Store(string key, T o) { ... } public T Load(string key) { ... } } Использование обобщений static void Main(string[] args) { ICacheProvider<int> cacheProvider = new MemoryCacheProvider<int>(); cacheProvider.Store("foo", 5); } Преимущества обобщений защита исходного кода безопасность типов простой и понятный код повышение производительности Открытые и закрытые типы открытый тип — тип с обобщенными параметрами-типами Dictionary<,> закрытый тип — тип, у которого всем аргументам-типам переданы действительный типы данных Dictionary<String, Int32> экземпляры открытых типов создавать нельзя Наследование обобщенный тип может быть производным от других типов при указании аргументов-типов создается объект-тип, производный от того же типа, что и обобщенный тип Обобщенные методы метод может задавать собственные параметры-типы параметры могут использоваться: параметры возвращаемое значение локальные переменные Пример обобщенного метода void Swap<T>(ref T a, ref T b) { T temp = a; a = b; b = temp; } Int32 n1 = 1, n2 = 2; String s1 = "tom", s2 = "bill"; Swap<Int32>(ref n1, ref n2); Swap<String>(ref s1, ref s2); Swap(ref n1, ref n2); // логический вывод типов Swap(ref s1, ref s2); // (type inference) Ограничения код должен работать с любыми типами данных область применения обобщений расширяется за счет ограничений T Min<T>(T a, T b) { return (a.CompareTo(b) < 0) ? a : b; }
Ограничения (constraints) – механизм, позволяющий сузить перечень типов, которые можно передать в аргумент-тип Применяются к: обобщенным методам обобщенным типам Перегрузка: допускается по арности не допускается по именам или ограничениям T Min<T>(T a, T b) where T : IComparable<T> { return (a.CompareTo(b) < 0) ? a : b; } class SomeClass<T> where T : IComparable<T> {} Виды ограничений: основное дополнительное ограничение конструктора Основные ограничения ссылочный тип, указывающий на не-sealed класс нельзя использовать Object, Array, Delegate, MulticastDelegate, ValueType, Enum, Void допускается не более 1 ограничения особые основные ограничения: class [можно присвоить null] struct [можно вызвать конструктор] Дополнительные ограничения можно задавать несколько ограничений ограничения типа-интерфейса void M<T>(T t) where T : IComparable, IConvertible {} ограничения параметра-типа void M<T1, T2>(T1 t) where T2 : T1 {} Ограничения конструктора указанный аргумент-тип должен быть неабстрактного типа, реализующего открытый конструктор без параметров допускается не более 1 ограничения несовместно с ограничением struct class SomeClass<T> where T : new() {} |
||
Последнее изменение этой страницы: 2018-05-27; просмотров: 258. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |