6

以下の 2 つのケースの違いは何ですか。

class Data
{
    PersonDataContext persons = new PersonDataContext();
    public Data() {}
}

class Data
{
    PersonDataContext persons;
    public Data() 
    {
        persons = new PersonDataContext();
    }
}

私はasp.netで同じ質問をしています:

public partial class Data : System.Web.UI.Page
{
    PersonDataContext persons = new PersonDataContext();
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

public partial class Data : System.Web.UI.Page
{
    PersonDataContext persons;
    protected void Page_Load(object sender, EventArgs e)
    {
        persons = new PersonDataContext();
    }
}
4

6 に答える 6

4

最初のケースでは、宣言の場所で変数を初期化します。

2 つ目では、コンストラクターで初期化します。

主な違いは、追加のコンストラクターがあり、コンストラクターの初期化またはチェーンを忘れた場合、初期化されていない変数を持つことができることです。

于 2012-11-15T12:22:45.607 に答える
3

2番目の例では、主な違いは、Page_Loadが要求の処理時に呼び出される多くのASP.NETイベントの1つにすぎないことです。その結果、Page_Loadの前に発生したイベントは、まだ初期化されていないため、このフィールドにアクセス/使用できません。

ASP.NETページのライフサイクルを確認します:http://msdn.microsoft.com/en-us/library/ms178472%28v=vs.100%29.aspx

于 2012-11-15T12:40:01.947 に答える
3

フィールド初期化子は、コンストラクター呼び出しの前に実行されます。したがって、ケース 1 では、オブジェクトはPersonDataContextコンストラクター呼び出しの前に作成されます。

PersonDataContext persons = new PersonDataContext();

2番目のケースでは、コンストラクターが最初に実行され、次にフィールドが初期化されます。

簡単なテストを行うことができます

class PersonDataContext
{
    public PersonDataContext()
    {
        Console.WriteLine("In PersonDataContext Constructor");
    }
}
class Data
{
    PersonDataContext persons = new PersonDataContext();
    public Data() 
    {
        Console.WriteLine("In Data Contructor");
    }
}

class Data2
{
    PersonDataContext persons;
    public Data2() 
    {
        Console.WriteLine("In Data2 Constructor");
        persons = new PersonDataContext();
    }
}

そして、 Main メソッドで

static void Main(string[] args)
{

    Data d1 = new Data();
    Data2 d2 = new Data2();
    Console.Read();
}

出力

In PersonDataContext コンストラクタ // ケース 1

データ コンストラクターで //ケース 1

In Data2 コンストラクタ //ケース 2

In PersonDataContext コンストラクタ // ケース 2


ASPの例では、最初のケースではフィールドがPage_Loadイベントの前に初期化され、2番目のケースではフィールドがPage_Loadイベントで初期化されます

于 2012-11-15T12:29:42.363 に答える
2

唯一の違いは、オブジェクトが作成される順序です。よく覚えていれば、フィールド初期化子はコンストラクターの前に実行されるため、コンストラクターがフィールドを参照した場合、フィールドは既にそこにあります。

しかし、ケースの 99.9% から、2 つの違いは見られません。ほとんどの場合、フィールドを直接初期化する方が安全です。これにより、コンストラクターまたは派生クラスが複数あり、階層が複雑な場合に、フィールドを忘れるのを防ぐことができます。

多くの場合、コンストラクターは、フィールド初期化子では使用できないフィールドにデータを入力するために外部パラメーターを取得するために使用されます。

于 2012-11-15T12:24:45.457 に答える
0

unintialized variable for second caseオブジェクトの初期化にデフォルトのコンストラクター以外のコンストラクターを使用すると、次のようになります-

Data data = new Data(5);

しかし、これが好きならchain parametized constructors to call default constructor-

class Data
{
    PersonDataContext persons;
    public Data() 
    {
        persons = new PersonDataContext();
    }

    public Data(int a) : this()
    {

    }
}

変数personsが初期化されます。

于 2012-11-15T12:37:14.317 に答える
0

最初の例では、コンストラクターが唯一のコンストラクターである限り、効果的な違いはありません。他のコンストラクターを追加する場合は、それらすべてが「persons」フィールドを初期化するようにする必要があります。

ASP.NET の例 (2 番目のコード スニペット) では、Page_Load メソッドの「persons」フィールドを初期化しています。つまり、このフィールドを使用する他のメソッドでは、初期化されていないことがわかる可能性があります。(Page_Loadのことですか、それともConstructorにするつもりだったのですか...?)

要するに、「persons」フィールドが常に非 null である必要がある場合は、フィールド初期化子として初期化する方が安全です...

于 2012-11-15T12:38:31.413 に答える