在创建类的实例中,关键字“new”和“default”之间有所不同

时间:2017-07-07 08:56:59

标签: c# constructor

我喜欢上课:

 class foo
    {
        public foo(string Text)
        {
        }
    }

运行此代码以创建类的实例obj1设置为null

foo obj1 = default(foo);

通过打击代码一切正常:

foo obj2= new foo("bla bla");

我有2个问题:

  1. 运行default(foo);时,默认承包商会发生什么?
  2. foo obj1 = default(foo);等于foo obj1 = null
  3. 提前致谢。

4 个答案:

答案 0 :(得分:5)

以下是default的工作原理:

  

返回null   引用类型和zero表示数值类型。对于structs,它会   将struct初始化为zeronull的每个成员依赖   关于它们是价值还是参考类型。对于nullable值   types,default返回一个System.Nullable<T>,它被初始化为   任何struct

new运算符只是创建类的新实例并初始化属性/字段,因为它是在构造函数中编写的。

  

用于创建对象并调用构造函数。

答案 1 :(得分:2)

根据documentation,默认将变量设置为其默认值。这意味着可空类型将设置为null,数字类型设置为0。

答案 2 :(得分:1)

它不会调用构造函数只使用默认值进行初始化。 请记住,它也与int,double和structs等值类型相关。 另一个用例是默认的泛型类型。 每种类型都有一个预定的默认值,该值在https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table

指定

答案 3 :(得分:1)

本质上,default(T)只保留保存引用所需的最小内存,或类型的实例,它不会调用任何构造函数。

  • 对于intbool这样的原始类型,返回的值分别为0false
  • 对于引用类型(类),唯一的保留是针对引用,它将为null
  • 对于结构体,结构的内存将根据上述规则保留,因此引用字段将初始化为null,即使它们通常不能null因为构造函数!值字段将具有默认设置(0false等)。
  • 对于枚举类型,除非您已为枚举标签手动指定值,否则值将初始化为其第一个(0值)字段,在这种情况下,该值仍为0且可能无效。