Когда генерируется дженерик класс конкретного типа при выполнении программы или во время компиляции

В 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru