2010-03-25 6 views
0

Я понимаю, что новое ключевое слово 'dynamic' в C# 4.0 облегчает взаимодействие с динамическими .NET-языками и может помочь сократить код, используя его вместо отражения. Поэтому использование предназначено для особых ситуаций.Является ли ключевое слово «dynamic» и DLR продвигать C# гражданину первого класса в качестве динамически типизированного языка?

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

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

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

ответ

5

Я бы не сказал, что 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 API. Есть места, где это может быть полезно в пределах чистого C#, но они относительно редки.

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

+0

Спасибо. Очень четкий и информативный ответ. Интересная информация о явной реализации интерфейса. –

1

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