Почему методы в классе DynamicObject не являются общими? - PullRequest
3 голосов
/ 15 марта 2011

Я читал эту статью о Динамических объектах в C # 4.0 .
В этом примере второй аргумент функции TryGetMember (привязка GetMemberBinder, результат объекта out) имеет тип Object,Я посмотрел в MSDN и заметил, что другие методы также получают аргументы как Object.Почему эти функции не являются общими?
С MSDN

По отношению к простым назначениям упаковка и распаковка являются вычислительно дорогостоящими процессами

Еслибокс / распаковка дороги, не лучше ли использовать дженерики?

Спасибо.

1 Ответ

8 голосов
/ 15 марта 2011

Обратите внимание на «в отношении простых заданий». Другими словами, по сравнению с одной из самых дешевых операций бокс стоит дорого.

По сравнению с остальными машинами, задействованными в динамическом наборе текста, бокс дешев:)

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

dynamic foo = GetDynamicValueFromSomewhere();
Console.WriteLine(foo.SomeProperty);

это только решит, какую перегрузку Console.WriteLine использовать после того, как SomeProperty был оценен. У него нет «ожидаемого» возвращаемого типа ... так какой аргумент универсального типа вы ожидаете использовать?

Имейте в виду, что большинство сценариев динамической типизации все равно будет использовать object в качестве промежуточного типа выражения в CLR. Если я напишу:

dynamic x = 10;

это уже бокс. Вы не можете представлять «распакованный тип значения неопределенного типа» в CLR. (Сколько места он выделит?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...