2009-07-29 7 views
1

以下のイタリック体のコードでは、なぜ "IntIndexer"をの前に置いてはいけませんか?myData = new string [size];以降カスタマーcust = new Customer();(仮定顧客は、クラスの名前である):これらの2行の違いは何ですか? (C#)

*Customer cust = new Customer();* 

システムを使用して、

/// <summary> 
///  A simple indexer example. 
/// </summary> 
class IntIndexer 
{ 
    private string[] myData; 

    public IntIndexer(int size) 
    { 
     *myData = new string[size];* 

     for (int i = 0; i < size; i++) 
     { 
      myData[i] = "empty"; 
     } 
    } 

答えて

5

Customer cust; 
cust = new Customer(); 

最初の行は、名前custがタイプCustomerのオブジェクトを参照できるようになることを言います。 2行目は新しいCustomerオブジェクトを作成し、custを参照します。

あなたが与える他の例は、すでにこれらの二つの部分に分かれています。

private string[] myData; 

と:

myData = new string[size]; 

文字列の配列は、一定の長さであることだったならば、我々はこれを折りたたむことができ(コンストラクタの前に)IntIndexerにも1行に挿入します。

private string[] myData = new string[100]; 

しかし、我々はIntIndexerコンストラクターに渡されたsizeを使用する必要があるので、我々は2つのステップに宣言と初期化を分割する必要があります。

0

コンストラクタの呼び出しを自分自身内に入れようとしていますか? IntIndexerをインスタンス化したい場合は、この関数を呼び出して、スタックオーバーフローを引き起こすか、または終了しないようになるまでプロセスを繰り返す必要があります.nはnを続けるだけでn番目のインスタンスを作成しようとしますアップ。

私は単純にそのようにトレースすれば、あなたの例で何が欠けていますか?

5

最初の行(cust)は、フィールドまたは変数を宣言して初期化しています。

第2の例では、フィールド(myData)が型に対して宣言され、コンストラクタ(IntIndexer(...))で初期化されています。その前に型を置いた場合(コンストラクタ内で)、ローカル変数を同じ名前で宣言します。これは混乱します(フィールドと変数をそれぞれ参照するにはthis.myDatamyDataを使用する必要があります)。

0

2つの異なることがあります。 myDataは、IntIndexerではなく、タイプstring[]として宣言されています。

クラスIntIndexerには、myDataという変数が含まれています。彼らは同等ではありません。

変数を再宣言しているため、このコード行の前には入力しないでください。そうすると、コンパイラエラーが発生します。

0

myDataは既にIntIndexerクラスのフィールドとして宣言されているため、コンストラクタで再宣言する必要はありません。クラスは、自身のフィールドを参照していることを理解しています。

Customer cust = new Customer(); 

をこの2つの部分に分けることができます:これを打破するには

関連する問題