1
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();
    }
}

混乱:

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

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

4

2 回答 2

3

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

readonly如果你在构造函数中包含一个没有赋值的字段,编译器会给你一个警告,因为它总是有那个默认值——但它仍然是初始化的。

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

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

public Test() {}

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

于 2013-02-16T16:02:15.220 回答
-1

你的构造函数

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

 public Test()
 {     
 }

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

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);
于 2013-02-16T16:14:55.880 回答