2010-11-02 48 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實現時,引入新類型並不是什麼理由。