在我的代码中,我一直在制作以下函数:
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&lt; string,object&gt;?声明我的方法的首选方法是什么?
(是否可以在代码部分加粗文字?)
答案 0 :(得分:2)
您应该切换到使用IDictionary或IDictionary。在IronPython 2.7中,IAttributesCollection实际上已经完全消失了。
原因是IAttributesCollection基本上只是一个字典,但添加了SymbolId的东西.WillidId的东西原本对于perf来说是好的(在添加它的各种场景中大约10%的胜利)但是它已经大部分已经过时了通过DLR现在拥有的呼叫站点基础设施。它还有一个问题,如果你动态生成SymbolId,它会导致内存泄漏。
它的另一个优点是它比IDictionary更简单的API - 但是当有大量有用的IDictionary实现时,引入新类型并不是什么原因。