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

錯乱:

完全なリファレンス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()
 {     
 }

num1とを初期化したい場合は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 に答える