Активатор. CreateInstance <T> По сравнению с новым

с telegram api вы не можете получить номера просмотров постов.

вы можете использовать библиотеку madelineproto ( https://docs.madelineproto.xyz ) для этого

27
задан Cory House 27 December 2012 в 21:26
поделиться

4 ответа

Эта перегрузка метода « Activator.CreateInstance » используется компиляторами для реализации экземпляров типов, заданных параметрами типа, с использованием универсальных шаблонов.

Допустим, у вас есть следующий метод:

public static T Factory<T>() where T: new()
{
    return new T();
}

Компилятор преобразует «return new T ();» для вызова CreateInstance.

В общем случае CreateInstance не используется в коде приложения, потому что тип должен быть известен во время компиляции. Если тип известен во время компиляции, можно использовать обычный синтаксис создания экземпляра (оператор new в C #, New в Visual Basic, gcnew в C ++).

Дополнительная информация: http://msdn.microsoft.com/ en-us / library / 0hcyx2kd.aspx

12
ответ дан 28 November 2019 в 05:43
поделиться

Я бы не назвал Activator.CreateInstance() избыточным.

Если вы знаете тип, да, вы просто использовали бы new. Однако в ситуациях, требующих динамической загрузки неизвестных типов из каркасов плагинов или когда тип анализируется из строки (например, из файла настроек), это чрезвычайно полезно.

И чтобы ответить на вопрос о разнице между ними, нет, под капотом нет никакой реальной разницы между вызовами new T() и Activator.CreateInstance<T>(), как уже указывал Эндрю Хэйр.

РЕДАКТИРОВАТЬ: Неважно, я перепутал общий CreateInstance<T>() с более обычно используемым в противном случае CreateInstance(Type type)

7
ответ дан J. Steen 28 November 2019 в 05:43
поделиться

Вызов new лучше с точки зрения производительности CreateInstance, вероятно, использует медленное отражение.
Если вы знаете тип во время разработки - используйте new, даже если два вызова были совершенно одинаковыми (а это не так!), Зачем усложнять код?

Используйте Activator.CreateInstance только в том случае, если вы не знаете тип T во время разработки и вам необходимо разрешение типа во время выполнения.

4
ответ дан 28 November 2019 в 05:43
поделиться

Нет, Activator.CreateInstance просто вызывает скрытый конструктор по умолчанию. Единственная разница между вашими примерами - это дополнительный вызов метода CreateInstance .

From Activator.CreateInstance :

Создает экземпляр типа обозначенный указанным родовым параметр типа, используя конструктор без параметров.

3
ответ дан 28 November 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: