2010-09-26 41 views
4

我寫了這個功能使用匿名類型代替字典的缺點?

private string BuildXPathQuery(string prefix = "descendant::", string tag = "*", object attrs = null) 
    { 
     StringBuilder sb = new StringBuilder(prefix); 
     sb.Append(tag); 
     if (attrs != null) 
      foreach (var a in attrs.GetType().GetProperties()) 
       sb.Append(string.Format("[@{0}='{1}']", a.Name, a.GetValue(attrs, null))); 
     return sb.ToString(); 
    } 

這樣,而不是寫

BuildXPathQuery(attrs: new Dictionary<string,string> {{"attr","value"}}); 

我可以寫

BuildXPathQuery(attrs: new {attr=value}); 

但這有什麼缺點?

回答

4

它使用的反射速度可能比正常類型訪問慢。另一個缺點是,通過查看方法簽名,您會看到一個對象,並且對於此方法的最終使用者而言,它可能並不總是很明顯,因爲對象可能實際上是任何東西:

當Intellisense顯示:

BuildXPathQuery(object attrs); 

你真的在這裏猜測,除非它是相當有據可查的(例如ASP.NET MVC HTML輔助用類似的方法建立在DOM元素HTML屬性)。

這是這麼多Rubyist辦法,我喜歡它:-)(可選參數和哈希表)

0

我覺得Annonymous類型涼爽,您可以在基於您發送的對象上方便拋合適的對象。

您可以將此匿名類型用於該方法,也可以通過反射來使用它。你也可以嘗試將對象撒入類型如果要使用:

var x = attrs as new{x="", y=""}; 

你要注意,編譯器是足夠聰明的利用現有的annonymous類型,而不是創造鑄造新的類型。

http://www.west-wind.com/weblog/posts/189329.aspx

正如前面已經講過,annonymous類型是比較慢的,所以我能看到的唯一問題是緩慢的性能。但是,匿名對我來說很酷。