В C# существует два механизма повторного использования кода в разных типах: наследование и обобщения (generics). Наследование делает возможным повторное использование благодаря применению базового класса, а обобщения — благодаря использованию параметров типа — шаблонов, или своеобразных плейсхолдеров типов.
Обобщенные типы (Generic Types)
Обобщенный тип содержит, или точнее объявляет параметры типа (type parameters) — своеобразные плейсхолдеры типов, которые будут заполнены в дальнейшем при использовании обобщенного типа, путем передачи в него аргументов типа (type arguments).
public class Stack < T >
int position ;
T [ ] data = new T [ 100 ] ;
public void Push ( T obj )
data [ position ++ ] = obj ;
public T Pop ( )
return data [ — position ] ;
В примере объявляется обобщенный тип Stack , который будет хранить экземпляры типа T . Stack объявляет единственный параметр типа — T . Использовать Stack можно так:
Stack < int >stack = new Stack < int >( ) ;
stack . Push ( 5 ) ;
stack . Push ( 10 ) ;
int x = stack . Pop ( ) ; // x = 10
int y = stack . Pop ( ) ; // y = 5
Как пройти СОБЕСЕДОВАНИЕ на C# & .Net РАЗРАБОТЧИКА?
Stack заполняет параметр типа T аргументом типа int . Фактически Stack имеет следующее определение:
public class ###
int position ;
int [ ] data ;
public void Push ( int obj )
data [ position ++ ] = obj ;
public int Pop ( )
return data [ — position ] ;
Замену параметра типа T на конкретный тип при инициализации экземпляра обобщенного типа называют закрытием типа. Так же говорят, что Stack является открытым типом (open type), а Stack — закрытым типом (closed type). Создать экземпляр открытого типа нельзя — все параметры типа должны быть закрыты при инициализации.
Задачи, которые решаю обобщенные типы, можно было бы решить с помощью базового типа object (что и делалось до появления в C# обобщений). Но такое решение является не самым эффективным, поскольку при выполнении программы придется выполнять по несколько операций упаковки и распаковки значений (boxing — приведение к объектному типу и unboxing — восстановление значения), что негативно сказывается на производительности и создает риск возникновения во время выполнения ошибок в приведении типов. Использование обобщений лишено этих недостатков.
Обобщенные методы (Generic Methods)
Параметры типа могут задаваться не только для типа в целом, но и для отдельного метода. Обобщенный метод объявляет параметры типа в сигнатуре метода.
static void Swap < T >( ref T a , ref T b )
T temp = a ; a = b ; b = temp ;
Когда генерируется дженерик-класс конкретного типа — при выполнении программы или
Когда ты инициализируешь класс класса дженерика с конкретным типом, на этом моменте компилятор понимает, что нужно сгенерить класс с данным типом. Поэтому второе.
15:49 07.08.2021
Эдуард
Когда ты инициализируешь класс класса дженерика с .
не, это делается во время рантайма, в этом прикол шарповых дженериков в отличие от джавовых
Обобщения в C# | C# generics | generic типы методы и классы | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | # 83
18:43 07.08.2021
Похожие вопросы
ну раз денег нет, то хуле приперся?
08:51 17.06.2023
Тупо если удалить или закоментировать этот блок ошибка уходит?
07:26 17.06.2023
10:17 16.06.2023
чо еще тебе посоветовать?
10:20 16.06.2023
10:17 16.06.2023
10:38 16.06.2023
всем привет! пишу программу на MAUI, Directory.GetFiles(folder) на одном телефоне возвращает пустой массив, а на другом возвращает список файлов. Почему может быть так, что Di.
10:33 16.06.2023
нахуя блядь вообще потоки если они друг за другом должны работать? работай в одном потоке и не еби людям мозг
17:10 16.06.2023
да вы гоните что ли? он один абзац текста вытужить не может, а вы ему тут тз еще и погромировать выкатили
17:40 16.06.2023
тоесть моя идея программа стартует — создает базу и запрашивает пароль (подразумевается что развертывает админ) и вот без него в базу не зайти но где его хранить?
Источник: telq.org
Объясните принцип выполнения кода (дженерики)
2 авг 2019 в 6:33
2 авг 2019 в 10:05
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Так как generic класс Gen объявлен как raw type , т.е. не указан никакой generic параметр при объявлении, то и методы в Gen будут с raw type параметрами, потому что эти методы члены класса, т.е. они будут просто принимать Collection и List . Тут и выбирается более подходящий метод с List . А сам ClassCastException происходит в цикле, когда объект Integer пытаются привести к String . Если String в цикле заменить на Object , то будет вызываться метод toString и падения не будет. Не используйте generic типы без generic параметра, у них отсутствует проверка типов во время компиляции. Используйте хотя бы <?>при объявлении инстанса generic класса. Gen <?>gen = new Gen<>();
Отслеживать
ответ дан 2 авг 2019 в 7:21
4,252 1 1 золотой знак 9 9 серебряных знаков 15 15 бронзовых знаков
а чем Gen отличается от Gen?))))
2 авг 2019 в 8:04
2 авг 2019 в 8:05
так у автора в методе void m(List list) , вообще не используется обобщенный дженерик, так ваш инстанс ничего не даст
2 авг 2019 в 8:10
Источник: ru.stackoverflow.com