【问题标题】:Why anonymous types aren't dynamic as the ExpandoObject? [closed]为什么匿名类型不像 ExpandoObject 那样动态? [关闭]
【发布时间】:2014-02-01 19:24:30
【问题描述】:

对于dynamic,我们几乎有一个动态指针,但不完全是一个动态对象。 C# 中真正的动态对象是ExpandoObject,但对于大多数人来说,这是一个真正未知的类。 expando 允许在运行时创建和删除成员,很像哈希(类似于 JavaScript)。

为什么 ExpandoObject 的优点是在一个单独的类中实现,而不仅仅是作为匿名类型的一个特性来实现?

也许由于缺乏类型安全性,这不是一个好的举措?或者可能是由于涉及 (DLR) 开销?

【问题讨论】:

  • “我们在 C# 中使用动态的大部分时间是在处理匿名类型时。”什么?在处理匿名类型时,您根本不应该使用dynamic。如果是,则说明您错误地使用了该功能。匿名类型旨在创建具有编译时类型安全性的简单对象,当您使用dynamic 时,您*会将其扔出窗口。
  • 匿名类型早在dynamic 之前就已经实现了。
  • @talles 您根本不应该将dynamic 与匿名类型一起使用。如果您将它们一起使用,则很可能出现问题。您对匿名类型的使用不应与dynamic 一起使用,您对dynamic 的使用通常不应涉及匿名类型。
  • @HighCore 是的,这也是我的猜测。当然,你不应该那样做;这与匿名类型的预期目的相反。
  • @talles 如果任何给定的variable 的范围超出了方法范围,并且您必须在其他方法或类中使用它,则创建一个适当的强类型 POCO 对象来保存数据您当前正在输入匿名类型。

标签: c# anonymous-types expandoobject dynamic-typing


【解决方案1】:

因为匿名类型还有其他非常重要的特性——它们为您提供编译时类型安全。

因为dynamic 和匿名类型只是不同的概念。第一个使您能够在运行时调度对象成员,第二个使您可以创建具有某些基本功能(相等、哈希码等)的静态类型对象,而无需创建相应的 POCO 类。那么为什么要以同样的方式实现呢?

顺便说一句。我经常使用它们,而且很少需要使用dynamic 来处理它们。您确定您正确使用了这些语言功能吗?

更新

我认为这是匿名类型教程中非常重要的部分:

如果您必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型。

【讨论】:

  • 为什么假设我必须经常这样做?
  • +1。 @talles - 我不认为这个答案假设了你的使用频率(你对那个句子的措辞也可能导致这种假设,尤其是“主要是...... 我们......”部分)。我猜dynamic 并不是来自强类型语言的人最喜欢的功能 - 所以你会得到无关的使用它。
  • @AlexeiLevenkov 我不介意使用 dynamic 来设计它。匿名类型不适用于 dynamic
  • @AlexeiLevenkov,你是对的,我重新阅读了我的问题,听起来可能是这样。我改写了它,但它现在几乎毁了。有时,SO 用户所做的雪崩是残酷的。
  • 我实际上确实介意使用dynamic - 调试起来更加痛苦,尤其是在“抛出时”打开异常时 - 几乎每次调用未知属性都会导致异常......但是不幸的是,它们在 ASP.Net MVC 中的 ViewBag 等框架中使用...
猜你喜欢
  • 2012-05-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多