2010-11-02 196 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 <字符串,对象>?什么是声明我的方法的首选方法?

(是否有可能在代码段粗体字?)

回答

2

您应该切换到使用的IDictionary或IDictionary的。在IronPython 2.7中,IAttributesCollection实际上完全没了。

其原因是IAttributesCollection基本上只是一个字典,但添加了SymbolId的东西。SymbolId的东西原来是完美的perf(在添加时在各种场景中〜10%的胜利),但它主要是DLR现在拥有的呼叫站点基础设施已经过时。它也有问题,如果你动态生成SymbolId的话会导致内存泄漏。

它拥有的另一个优点是它比IDictionary更简单 - 但是当有大量有用的IDictionary实现时,引入新类型并不是什么理由。