1

オブジェクトの配列について学び始めましたが、いくつかの問題があります。Personクラスとクラスの簡単なコードを見つけましPersonArrayた。PersonArray クラスのメソッドの 1 つが次のようになっています (m_Arr は Person 配列です)。

public void Add(Person p)
        {
            if (p == null)
                Console.WriteLine("Error, param can't be null");
            if (m_Arr.Length <= m_Counter)
            {
                Array.Resize(ref m_Arr, m_Arr.Length + 10);
            }
            m_Arr[m_Counter++] = p;
        }

私の質問は、いつ p になることができますnullか? null にならないように、オブジェクトにどのような値を設定できるのでしょうか? また、別の質問があります - m_Counter 変数 (カウンター) は初期化されていませんが、問題なく動作しています。なんでOKなの?

4

5 に答える 5

1

m_Counterは、デフォルト値を持つネイティブ型です。整数の場合はゼロになります

pはnullになることも、nullにならないようにすることもできます。次のように初期化する必要があります。

Person p = new Person();

Addメソッドを呼び出す前

于 2012-12-14T14:02:14.673 に答える
1

すべての変数は、宣言時にデフォルト値で初期化されます(C#仕様では§5.2)。m_counterはintであるため、デフォルト値は0(§4.1.2)です。
新しいインスタンスが作成されるとすぐにm_counterが確実に割り当てられると見なされるため、コンパイラは文句を言いません(§5.3.1)。

于 2012-12-14T14:03:43.730 に答える
1

pがnullにならないようにするには、インスタンス化されている必要があります。

var p = new Person();

p値を設定しないようにするために値を設定することはできませんnull。値を設定する前に、インスタンス化する必要があります。

についてm_counterは、整数データ型だと思いますので、デフォルトでは0になります。

于 2012-12-14T14:00:41.720 に答える
1

次のように記述した場合、p は null になる可能性があります。

Person p = null;

m_Counter はクラスのスコープ内の変数のように見えるため、コードの別の部分で初期化できます。次に例を示します。

class SomeClass
{
    static int m_Counter = 0;
    static Person[] m_Arr = new Person[] { };

    public void Add(Person p)
    {
        if (p == null)
            Console.WriteLine("Error, param can't be null");
        if (m_Arr.Length <= m_Counter)
        {
            Array.Resize(ref m_Arr, m_Arr.Length + 10);
        }
        m_Arr[m_Counter++] = p;
    }  
}
于 2012-12-14T14:05:17.320 に答える
1

オブジェクトがインスタンス化されていない場合は、NULL になります。インスタンス化されると、それは人のインスタンスになります so p = new Person(). 次のように NULL に戻すこともできますp = null;

于 2012-12-14T14:01:58.640 に答える