Делает ли ключевое слово Dynamic в C# 4.0 универсальные шаблоны ненужными?

StackOverflow https://stackoverflow.com/questions/828303

Вопрос

Меня очень интересуют динамические возможности C# (Динамическое ключевое слово C#4 – почему бы и нет?), особенно потому, что в некоторых частях моего кода библиотеки я использую много отражений.

Мой вопрос двоякий:

1.заменяет ли «динамический» Generics, как в случае ниже?

Общий метод:

public static void Do_Something_If_Object_Not_Null<SomeType>(SomeType ObjToTest) {

        //test object is not null, regardless of its Type
        if (!EqualityComparer<SomeType>.Default.Equals(ObjToTest, default(SomeType))) {
            //do something
        }
    }

динамический метод(??):

public static void Do_Something_If_Object_Not_Null(dynamic ObjToTest) {

        //test object is not null, regardless of its Type?? but how?
        if (ObjToTest != null) {
            //do something
        }
    }

2.позволяет ли теперь «динамический» методам возвращать анонимные типы, как в случае ниже?:

 public static List<dynamic> ReturnAnonymousType() {
        return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList();
    }

круто, ура

РЕДАКТИРОВАТЬ:

Еще немного обдумав свой вопрос и проанализировав ответы, я вижу, что полностью испортил основной общий/динамический вопрос.Они действительно совершенно разные.Так что да, спасибо за всю информацию.

А как насчет пункта 2?

Это было полезно?

Решение

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

Обобщения позволяют вам узнать (во время компиляции) о типе, с которым вы работаете - и наоборот, dynamic не делает Забота о типе.В частности — дженерики позволяют указать и доказать ряд условий. о тип - т.е.он может реализовывать некоторый интерфейс или иметь общедоступный конструктор без параметров. dynamic тоже не помогает:он не поддерживает интерфейсы, и, что хуже, чем просто не заботиться об интерфейсах, это означает, что мы даже не можем видеть явные реализации интерфейса с dynamic.

Кроме того, dynamic это действительно частный случай object, поэтому бокс вступает в игру, но с удвоенной силой.

На самом деле вам следует ограничить использование dynamic в нескольких случаях:

  • COM-взаимодействие
  • Взаимодействие с DLR
  • может быть немного легкого набора текста
  • может быть некоторые общие операторы

Во всех остальных случаях лучше всего использовать дженерики и обычный C#.

Другие советы

Чтобы ответить на ваш вопрос. Нет.

  • Дженерики дают вам "повторное использование алгоритма"- вы пишете код, независимый от Типа данных.ключевое слово динамическое не делает ничего связанного с этим.Я определяю List<T> и тогда я смогу использовать его для списка строк, целых чисел и т.д.
  • Тип безопасности:Всю дискуссию о проверке времени компиляции.Динамические переменные не будут предупреждать вас предупреждениями/ошибками во время компиляции в случае, если вы допустите ошибку, они просто взорвутся во время выполнения, если метод, который вы пытаетесь вызвать, отсутствует.Дебаты о статической и динамической типизации
  • Производительность :Обобщения повышают производительность алгоритмов/кода, использующих типы значений, на значительный порядок.Это предотвращает весь цикл упаковки-распаковки, который стоил нам предварительных дженериков.Динамический тоже ничего для этого не делает.

Что за dynamic ключевое слово даст вам это

  • более простой код (скажем, когда вы взаимодействуете с Excel..) Вам не нужно указывать имя классов или объектную модель.Если вы вызываете правильные методы, среда выполнения позаботится о вызове этого метода, если он существует в объекте на данный момент.Компилятор позволяет вам уйти, даже если метод не определен.Однако это означает, что это будет медленнее, чем вызов метода, проверенного компилятором/статического типа, поскольку CLR придется выполнять проверки перед вызовом динамического поля/метода var.
  • Динамическая переменная может содержать разные типы объектов в разные моменты времени. Вы не привязаны к определенному семейству или типу объектов.

Чтобы ответить на ваш первый вопрос, дженерики разрешаются во время компиляции, а динамические типы — во время выполнения.Таким образом, существует определенная разница в безопасности типов и скорости.

Динамические классы и дженерики — это совершенно разные понятия.С помощью дженериков вы определяете типы во время компиляции.Они не меняются, они не динамичны.Вы просто помещаете «заполнитель» в какой-то класс или метод, чтобы вызывающий код определял тип.

Динамические методы определяются во время выполнения.У вас нет безопасности типов во время компиляции.Динамический класс аналогичен тому, как если бы у вас были ссылки на объекты и вызывались методы по их строковым именам с использованием отражения.

Ответ на второй вопрос:Вы можете возвращать анонимные типы в C# 3.0.Приведите тип к объекту, верните его и используйте отражение для доступа к его членам.Ключевое слово Dynamic — это всего лишь синтаксический сахар.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top