【问题标题】:C# - Are Dynamic Parameters BoxedC# - 动态参数是否装箱
【发布时间】:2012-06-30 10:26:37
【问题描述】:

如果我有:

void Foo(dynamic X) {
}

然后:

Foo(12);

12 会被装箱吗?我无法想象会这样,我只是想问问专家。

【问题讨论】:

  • 为什么你认为它不会?如果不是作为对象,您如何想象运行时会存储 unknown compile-time type 的值? (这不是一个修辞问题;我有兴趣了解为什么人们的直觉会导致他们相信关于语言特征的错误信息,以便我们可以在未来尝试设计更好的特征。)
  • 你在 C# 团队吗?对我来说,这不是一个合理的假设。由于 C# 中添加了所有令人惊叹的酷特性,有时很容易忘记 C# 仍然是一种静态类型语言,所以它怎么可能不是在幕后成为对象。如果您在 C# 团队中,那么感谢您提供的 lambda 表达式。有史以来最好的语言功能。
  • @Adam:不客气。我非常喜欢实现 lambda 表达式,很高兴您喜欢使用它们!
  • 另请参阅stackoverflow.com/questions/4892704 以了解有关此主题的更多思考。 (即动态和对象的等价性。)
  • 我同意 lambda 表达式非常酷。我用它所有的时间。正是这些东西使 C# 成为我最喜欢的语言。那和.NET。

标签: c# dynamic c#-4.0 boxing


【解决方案1】:

是的,会的。

在底层,dynamic 类型只是带有一些元数据的 object,因此当放入 dynamic 类型的变量、字段或参数时,值类型将被装箱。

方法实际上会这样编译:

void Foo([Dynamic] object X)
{
}

详细了解DynamicAttribute here

IL 代码调用它:

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 8
    L_0000: nop 
    L_0001: ldc.i4.s 12
    L_0003: box int32
    L_0008: call void ConsoleApplication13.Program::Foo(object)
    L_000d: nop 
    L_000e: ret 
}

【讨论】:

  • 我有一种下沉的感觉,这就是答案。谢谢。
【解决方案2】:

是的。值类型需要装箱才能进行类型检查。

【讨论】:

    【解决方案3】:

    是的!

    由于它是一个值类型,它会被装箱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 2016-06-27
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多