Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么匿名类型不是';作为ExpandoObject的动态?_C#_Anonymous Types_Expandoobject_Dynamic Typing - Fatal编程技术网

C# 为什么匿名类型不是';作为ExpandoObject的动态?

C# 为什么匿名类型不是';作为ExpandoObject的动态?,c#,anonymous-types,expandoobject,dynamic-typing,C#,Anonymous Types,Expandoobject,Dynamic Typing,使用dynamic我们几乎有一个动态指针,但不完全是一个动态对象。C#中真正的动态对象是,但对于大多数人来说,这是一个真正未知的类。expando允许在运行时创建和删除成员,很像散列(类似于JavaScript) 为什么ExpandoObject是在一个单独的类中实现的,而不仅仅是作为匿名类型的一个特性实现的 也许这不是一个好的举动,因为缺乏类型安全性?或者可能是由于所涉及的(DLR)开销?因为匿名类型还有其他非常重要的特性-它们为您提供编译时类型安全性 因为动态和匿名类型只是不同的概念。第一个

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

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


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

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

因为动态和匿名类型只是不同的概念。第一个允许您在运行时分派对象成员,第二个允许您创建具有一些基本功能(相等、哈希代码等)的静态类型对象,而无需创建相应的POCO类。那么,为何要以同样的方式实施呢

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

更新

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

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


“我们在C#中使用动态的大部分时间是在处理匿名类型时。”什么?在处理匿名类型时,您根本不应该使用
dynamic
。如果是,则表明您未正确使用该功能。匿名类型旨在创建具有编译时类型安全性的简单对象,在使用
dynamic
时,您会*直接将其抛出窗口。匿名类型早在
dynamic
@talles之前就已实现。您根本不应该对匿名类型使用
dynamic
。如果你在一起使用它们,很可能是出了问题。您对匿名类型的使用不应与
dynamic
一起使用,您对
dynamic
的使用通常不应涉及匿名类型。@HighCore是的,这也是我的猜测。当然,你不应该这样做;这与匿名类型的预期用途相反。@如果任何给定的
变量
的作用域超出了方法作用域,您必须在其他方法或类中使用它,然后创建一个适当的,强类型POCO对象来保存当前放入匿名类型中的数据。为什么假设我必须经常这样做?+1@计数-我不认为这个答案对你的使用频率有任何假设(你对这个句子的措辞也可能导致这样的假设,特别是“大部分……我们……”部分)。我想
dynamic
并不是强类型语言的人最喜欢的功能,所以你会听到一些关于使用它的无关的聊天。@AlexeiLevenkov我不介意在设计用于语言的情况下使用
dynamic
。匿名类型对于
dynamic
@AlexeiLevenkov来说不是很好的例子,你是对的,我重新阅读了我的问题,听起来可能是这样的。我重写了它,但现在它几乎毁了。有时,用户所做的雪崩是残酷的。实际上,我介意使用
动态
——调试要痛苦得多,特别是当异常打开到“抛出时”——几乎每个对未知属性的调用都会导致异常。。。但不幸的是,在ASP.NETMVC的框架中使用了它们,比如
ViewBag
。。。