【问题标题】:Disadvantages of using anonymous types in place of dictionaries?使用匿名类型代替字典的缺点?
【发布时间】:2010-09-26 20:26:58
【问题描述】:

这个函数是我写的

    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});

但这有什么缺点吗?

【问题讨论】:

    标签: c# dictionary anonymous-types


    【解决方案1】:

    它使用可能比普通类型访问慢的反射。另一个缺点是,通过查看方法签名,您会看到一个对象,而对于该方法的最终使用者,它可能并不总是很明显它必须放在那里,因为对象实际上可以是任何东西:

    当 Intellisense 显示时:

    BuildXPathQuery(object attrs);
    

    你真的不得不在这里猜测,除非它有很好的文档记录(例如 ASP.NET MVC HTML 助手使用类似的方法在 DOM 元素上构建 HTML 属性)。

    我很喜欢这种 Rubyist 方法 :-)(可选参数和哈希表)

    【讨论】:

      【解决方案2】:

      我认为匿名类型很酷,您可以根据您发送的对象轻松地将其转换为适当的对象。

      你可以在方法中使用这个匿名类型,也可以通过反射来使用它。如果您愿意,也可以尝试将对象转换为类型:

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

      您应该注意,编译器足够聪明,可以使用现有的匿名类型,而不是为强制转换创建新类型。

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

      如前所述,匿名类型的速度较慢,所以我能看到的唯一问题是性能缓慢。但是匿名对我来说看起来很酷。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-26
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多