Почему библиотеки COM, используемые в C# 4.0, требуют такого интенсивного использования динамических типов?
В демонстрациях C# 4.0 я вижу много кода, который использует динамический тип. Например, следующий код устанавливает значение ячейки Excel:
excel.Cells [1, 1].Value =...
Тем не менее, вы также можете получить доступ к ячейке ранним способом с помощью приведения:
((Диапазон)excel.Cells[1, 1]). Значение = ...;
Почему библиотека Excel COM просто не описывает тип Cell как тип Range в первую очередь? Аналогично, все аргументы следующего метода являются динамическими:
excel.ActiveWorkbook.Charts.Add (...)
Почему аргументы не могли быть статичными? Глядя на объектную модель Excel, везде есть динамические типы. Это связано с ограничениями выразительности в COM? Есть ли шаблон, когда динамические типы, а не статические типы используются в библиотеках COM?
3 ответа
Библиотека COM представляет это как вариант, который может означать любое количество вещей. Это действительно вина "библиотеки" Office за то, что она сделала так много с вариантами.
dynamic
type - ближайший.NET эквивалентный варианту (теперь он существует), но команда не хотела менять tlbimp
генерировать динамические типы в PIA по причинам обратной совместимости. Вы получите преобразование "вариант в динамический" в C# 4 только при связывании PIA (сборка битов, которые вы используете в свою собственную сборку) вместо ссылки на нее.
В демонстрациях C# 4.0 я вижу много кода, который использует динамический тип.
поскольку dynamic
Это одно из самых больших изменений в C# 4.0, я был бы очень удивлен, если бы это было не так. Это не значит, что вы должны немедленно начать писать весь свой код с dynamic
- просто, что вы должны понимать, когда это может быть полезно.
Различия и необязательные / именованные изменения аргументов, конечно, тоже приветствуются - но сделайте намного более короткую демонстрацию.
Исторически сложилось так, что Office (в частности) был настолько свинчивым для программирования, что это "большая вещь" для людей, которые автоматизируют Office.
- люди, которые потребляют COM (и Office особенно)
- люди, которые используют типы DLR (IronPython и т. д.)
- люди, которые общаются с динамическими системами, такими как javascript (Silverlight и т. д.)
Лично я не ожидаю dynamic
революционизировать способ, которым я программирую на C#, но это важно для некоторых людей:
На самом деле это потому, что библиотека Office com была создана с учетом Visual Basic.
Еще больше вы можете думать, что вся иерархия объектов была создана для VB (обычный VB без.net). И VB исторически создавал такой способ, что с него просто использовать com-интерфейсы IDispatch'able (используя позднюю привязку).
И то, что мы имеем сейчас, это бремя обратной совместимости.