Продвигает ли ключевое слово «dynamic» и DLR C # первоклассному гражданину как динамически типизированному языку? - PullRequest
0 голосов
/ 25 марта 2010

Я понимаю, что новое ключевое слово dynamic в C # 4.0 облегчает взаимодействие с динамическими языками .NET и может помочь сократить код, используя его вместо рефлексии.Таким образом, использование предназначено для очень специфических ситуаций.

Тем не менее, я хотел бы знать, даст ли он C # все динамические преимущества, которые можно получить в других динамических языках, таких как языки IronXXX?Другими словами, будет ли возможно написать целое приложение на C # в стиле динамического языка?

И если это возможно, будет ли это рекомендовано или нет.И почему, или почему нет?

Получу ли я все преимущества динамического языка без переключения на другой язык?

Ответы [ 2 ]

5 голосов
/ 25 марта 2010

Я бы не сказал, что C # - это динамический язык первого класса, нет.

Во-первых, некоторые функции статической типизации действительно плохо работают с динамической типизацией. Например:

public void ShowListCount(IList foo)
{
    dynamic d = foo;
    Console.WriteLine(d.Count);
}

Похоже, это всегда должно работать, потому что IList выставляет Count, верно? Попробуйте это с этим:

ShowListCount(new int[10]);

Взрыва. Массивы реализуют IList.Count с явной реализацией интерфейса, поэтому при динамической типизации «видит» объект как массив, он не выглядит, видя свойство Count. Существуют различные подобные ошибки.

Кроме того, если вы хотите реализовать динамическое поведение в C # (то есть вызываться динамически), явной поддержки языка нет. Вы можете извлечь из DynamicObject или реализовать IDynamicMetaObjectProvider самостоятельно, но ничто в языке не поможет вам.

Я считаю динамическую типизацию в C # чем-то, что следует использовать в первую очередь, когда вы хотите взаимодействовать с существующей динамической платформой, такой как IronPython или COM-интерфейс со слабой типизацией. Есть несколько мест, где это может быть полезно в чистом C #, но они относительно редки.

По сути, C # по-прежнему совершенно очевидно является языком, разработанным с учетом статической типизации. Иметь возможность аккуратно использовать динамическую типизацию там, где вы хотите, это хорошо, но если вы хотите широко использовать динамическую типизацию для одной области вашей кодовой базы, я бы предложил написать этот бит в IronPython, а затем вызывать его из C #.

1 голос
/ 25 марта 2010

Хотя ключевое слово dynamic определенно приблизит C # к динамическому миру, оно не сделает его динамическим языком и, следовательно, не будет иметь преимуществ динамических языков, таких как добавление методов в существующий тип во время выполнения , ...

...