【问题标题】:Confusion Regarding Default Constructor关于默认构造函数的困惑
【发布时间】:2013-02-01 11:02:21
【问题描述】:
using System;
class Test
{
    string name;
    int num1, num2;

    public Test()
    {
        num1=10;
        num2=20;
    }

    public void Show()
    {
        Console.WriteLine(num1+num2);
        Console.WriteLine(name);
    }

}

class TestDemo
{
    static void Main()
    {
        Test ob = new Test();
        ob.Show();
    }
}

困惑:

完整参考 C# 3.0 说,如果您定义自己的构造函数,则不会调用默认构造函数。我做了那件事,但是没有用我定义的构造函数初始化字符串变量。现在根据上面的概念,字符串变量没有被初始化,并且没有默认构造函数会运行给它一个默认值,因为我已经定义了我自己的。

那么,为什么它没有显示错误,该字符串没有用任何值或类似的东西初始化。它不是表明它已经从某个地方[编译器的默认构造函数]分配了一个值吗?

【问题讨论】:

  • 首先,“默认构造函数”也不会初始化您的字符串;它将自动初始化为null。其次,是的,你的name 变量将为空,所以Console.WriteLine(name) 不会写任何东西,但它也不会爆炸。如果你做了类似Console.WriteLine(name.ToUpper()) 的事情,那么你会得到一个空指针异常。

标签: c# default-constructor


【解决方案1】:

不存在“未初始化”字段(无论是静态的还是实例的)。 所有字段都使用默认值初始化(引用类型为 null,值类型为“自然零”)。

如果您包含一个未在构造函数中分配值的 readonly 字段,编译器会向您发出警告,因为它会始终具有该默认值 - 但它仍处于初始化状态.

编译器只能在使用 local 变量而没有明确分配时发现。这是因为编译器在一个方法中比在一个类中的 between 方法中拥有更多关于控制流的信息。如果您有一个方法将值分配给字段,而另一个方法从字段中获取值,则编译器无法知道首先调用哪个方法 - 而明确赋值的规则允许它分析一种方法来发现潜在的流在没有先被赋值的情况下读取变量。

顺便说一句,这些都与默认构造函数无关。如果您根本不提供任何构造函数,则编译器仅提供默认构造函数 - 所以在您的 Test 类中,没有 default 构造函数本身,因为您已经提供了您自己的无参数构造函数。即使编译器确实提供了默认构造函数,它也完全等同于:

public Test() {}

...这些字段仍然只有它们的默认值。

【讨论】:

  • 先生,那么我们是否说构造函数将实例变量初始化为默认值...?我还是很困惑兄弟。
  • @Jon Skeet IMO 你应该用All INSTANCE fields are initialized 编辑你的这一行All fields are initialized 。因为人们可能也会将这一行用于方法局部变量 - 在使用它们之前需要初始化字段。
  • @sansix 局部变量不是字段。
  • @RanjhaniSaddam:在创建对象时,所有字段都被初始化为其默认值,在 构造函数 完全运行之前。
  • @sansix:hvd 说了什么。我非常小心地选择了fields这个词而不是variables
【解决方案2】:

你的构造函数

  public Test()
  {
      num1=10;
      num2=20;
  }

一样
 public Test()
 {     
 }

如果你想初始化 num1num2 ,你可以这样做:

private int num1, num2; //public fields are not recommended

public Test(int numberOne, int numberTwo)
{
    num1 = numberOne;
    num2 = numberTwo;
}

你可以如下进行初始化:

Test ob = new Test(10,20);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2018-04-26
    • 2015-04-08
    • 2013-05-24
    • 2016-07-23
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多