2010-12-11 3 views
3

Скажем, у меня есть класс под названием Composite, который содержит коллекцию другого класса Component, все из которых имеют свойство Name. Было бы лучше использовать Dictionary для хранения компонентов, или было бы лучше использовать динамический объект.Dynamic vs Dictionary [C#]

Например, было бы лучше сделать это:
Component component = someComposite.Components["RandomComponent"];
или это:
Component component = someComposite.Components.RandomComponent;

Где someComposite.Components находится во втором примере dynamic.

Второй случай, кажется, лучше, но нет тип безопасности ...

Я хочу добавить, что в какой-то момент я в конечном итоге делает это:
DerivedComponent component = someComposite.Components["RandomComponent"] as DerivedComponent;
В этом случае dynamic может сохранить я печатаю конверсию.

Так какой из них лучше?

ответ

3

Я хочу добавить, что в какой-то момент я будет в конечном итоге делает это: DerivedComponent компонент = someComposite.Components [ "RandomComponent"] в DerivedComponent; В этом случае динамика может спасти меня, набрав преобразование .

В статически типизированных языках, эти типы есть по причине; не просто выбросьте их из-за небольшого дополнительного синтаксиса, который вам нужно поставить. В этом синтаксисе есть предупреждение: «Эй, я делаю то, что здесь не безопасно!»

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


Кроме того, вы должны думать об условиях ошибки. С dynamic, ваш код на ошибки будет выглядеть следующим образом, если объект не содержит такого определения:

try 
{ 
    DerivedComponent c = obj.RandomComponent; 
    return c; 
} 
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) 
{ 
    // do something here... 
} 
catch (InvalidCastException) 
{ 
    // handle error 
} 

По сравнению с:

try 
{ 
    var c = obj["RandomComponent"] as DerivedComponent; 
    if (c == null) 
     // deal with error... 
    return c; 
} 
catch (KeyNotFoundException) 
{ 
    // do something here... 
} 

Это не кажется, что вы на самом деле спасти себя, что много типизации.

+0

Это больше похоже на это - спасибо за объяснение. – YellPika

6

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

Использовать Dictionary<string, Component>.

И посмотрите на System.ComponentModel (т. Е. Интерфейсы IContainer и IComponent).

+3

Так почему же я не должен использовать динамический? Вы дали мне информацию о том, где его использовать, но почему бы не использовать его в другом месте ... – YellPika