2010-11-02 5 views
1

В моем коде я делал такие функции, как:DLR: IAttributesCollection устарел?

public void Foo([ParamsDictionary] IAttributesCollection kwargs) {} 

Но мне было любопытно. Что все реализует этот интерфейс? Поэтому я спустил источник IronPython. В нем я нашел этот файл:

Src\Runtime\Microsoft.Scripting\Runtime\ParamDictionaryAttribute.cs 

В строках 24-30 он имеет это:

/// Most languages which support params dictionaries will support the following types: 
///  IDictionary<string, anything> 
///  IDictionary<object, anything> 
///  Dictionary<string, anything> 
///  Dictionary<object, anything> 
///  IDictionary 
///  IAttributesCollection (deprecated) 

Примечание устаревшие линии. Должен ли я использовать подпись метода, которую я имел выше, и вместо этого использовать IDictionary < string, object >? Каков предпочтительный способ объявления моих методов?

(Можно ли жирный текст в секциях кода?)

ответ

2

Вы должны переключиться на использование IDictionary или IDictionary. В IronPython 2.7 IAttributesCollection фактически полностью исчез.

Причина этого заключается в том, что IAttributesCollection - это просто словарь, но с добавленным дополнением к материалам SymbolId. Свойство SymbolId было изначально хорошо для perf (~ 10% выигрыш в различных сценариях, когда оно было добавлено), но оно было сделано в основном устаревшая инфраструктура вызываемого сайта DLR теперь имеет. Также возникает проблема: если вы динамически генерируете SymbolId, это вызывает утечку памяти.

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

 Смежные вопросы

  • Нет связанных вопросов^_^