【问题标题】:How Boxing and Unboxing Work for Dynamic DataType in C#C# 中动态数据类型的装箱和拆箱如何工作
【发布时间】:2016-06-27 17:38:06
【问题描述】:

我知道 C# 用于类型转换的装箱和拆箱概念。但是它如何在 C# 中用于动态变量。当我们使用动态变量时,类型转换是如何发生的。在哪方面遵循了c#的装箱和拆箱原则

我认为装箱和拆箱不会将动态类型视为对象,因为它们不同。不知道他们是否遵循相同的装箱和拆箱机制 看这个链接dynamic vs object type

当您使用动态时,整个表达式在编译时被视为动态表达式,这导致编译器将所有内容都视为动态并获得运行时绑定。

这是因为下面的 str 是动态的

    dynamic str = "22/11/2013 10:31:45 +00:01";
    var withOffset = DateTimeOffset.Parse(str);

在编译时 str 是动态的,str 的类型只能在运行时知道,这就是编译器将 withOffset 视为动态的原因

【问题讨论】:

  • dynamic 关键字是 object 的别名。值总是装箱,对象从不装箱。永远不需要帮助,你也不能。
  • 你是想说动态变量和对象是一样的吗?我不确定这个
  • 是动态的装箱和拆箱以及对象相同
  • 我认为动态和对象是不一样的。看这里 - stackoverflow.com/questions/3442821/dynamic-vs-object-type 你是想说装箱和拆箱是一样的
  • 它们在运行时是一样的,CLR不区分动态和对象。所以拳击行为是相同的。在编译时很重要,使用动态使 C# 编译器生成代码以使用 C# 绑定器到 DLR(动态语言运行时)。它优化了动态代码,例如反射、后期绑定 COM 以及与 Python 和 Ruby 等语言的互操作。通常是反射。

标签: c# c#-4.0 type-conversion boxing unboxing


【解决方案1】:

在装箱和拆箱方面,对象和动力学具有相同的行为(您可以在生成的 IL 代码中检查这一点)。

在这种情况下,这两者之间的主要区别是:

  • clr 在运行时添加一些 IL 代码,以确定它的真实类型以及您可以对其执行的操作(有效负载)。
  • 编译器让你这样做:

    1.var withOffset = DateTimeOffset.Parse(str);

    2.DateTimeOffset withOffset = DateTimeOffset.Parse(str);

    3.DateTime withOffset = DateTimeOffset.Parse(str);

    但是在运行时,clr 确保类型安全,所以如果你编写 case 3,它会编译,但在运行时 clr 会抛出 RuntimeBinderException。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多