none
构造值类型时,new操作符的用法? RRS feed

  • 问题

  • 在引用类型中,new操作符一般是实例化一个对象。但是,在值类型中,new操作符又是什么作用呢?

    据我了解,在引用类型中,一般new操作符调用的该类型的无参构造函数。

    但是,值类型是没有无参构造函数的,有一些书说编译器隐式的为值类型创建了无参构造函数,可是我在CLR via C#中查阅,里面说到编译器根本不会为值类型构造无参构造函数,用IL工具查看IL代码,确实也没有发现无参构造函数。

    那没有无参构造函数,SomeVal val = new SomeVal();(SimeVal为值类型)中的new起了什么作用?

    看到IL代码是

    initobj    '值类型和引用类型'.SomeVal

    难道这里的new,只起到了初始化数据的作用?

    请各位朋友解解惑!谢谢!

    2014年6月18日 11:33

全部回复

  • 在《.NET本质论》中找到答案了。

    原文说道:“不管是引用类型还是值类型,C#语言允许你使用同样的new操作符。当在引用类型上使用时,C#的new操作符被转换成一条CIL的newobj指令。它在调用类型的构造函数之后,将引发在堆上的分配行为。当你使用值类型时,CLR把C#的new操作符转换成一条CIL的initobj指令。它只是初始化实例,给每个字段赋予默认值”。

    但是,“编译器隐式的为值类型创建了无参构造函数”,这句话到底对还是不对?

    2014年6月19日 6:19
  • 建议你参看以下这个博客:

    http://www.cnblogs.com/xuefeng1982/archive/2009/02/21/1395493.html

    有两段我摘抄下来了:

    “C#编译器是否会为值类型生成默认的构造函数呢?

    答案是否定的,C#编译器并不会为值生成默认的构造函数的,这样设计一方面是基于性能方面的考虑,另外一个原因是值类型可以被隐式的创建!这一点可以通过ILDasm工具开验证,值类型确实没有生成默认的构造函数"

    然后请参照这里这里 http://msdn.microsoft.com/zh-cn/library/saxz13w4.aspx

    <sentencetext xmlns="http://www.w3.org/1999/xhtml">结构不能声明默认构造函数(没有参数的构造函数)或析构函数。</sentencetext> 而结构本身就是值类型,所以”编译器隐式的为值类型创建了无参构造函数“应该是不对的。



    Barry Wang
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年6月19日 8:13
    版主
  • 是啊,我在张子阳的《.NET之美》,甚至是《深入理解C#》(中文版,英文版没看)技术书籍中都看到了“编译器隐式的为值类型创建了无参构造函数”这么一句话,虽然《CLR via C# 》和《.NET 本质论》都说“编译器根本不会为值类型构造无参构造函数”,用IL工具查看IL代码,确实也没有发现无参构造函数。所以,就纠结了,想问个明白究竟是怎么回事!
    2014年6月19日 8:50
  • 我个人意见以为:

    1)代码(语法糖)方面:确实提供了无参构造函数,而且不允许你显示地去写。

    2)编译器方面:确实没有提供显示的构造函数。


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2014年7月1日 6:42
    版主