4

次のような int 配列を宣言すると、次のようになります。

int[] test = new int[5];

配列のすべての要素は、自動的に に初期化され0ます。int 配列などの配列が作成されたときに自動初期化されるクラスを作成できる方法はありますか?

例えば:

MyClass[] test2 = new MyClass[5];

コンストラクターを呼び出す必要があります。しかしint、コンストラクターを使用すると、魔法のように呼び出されます。

intこの動作を許可するクラスのコード/演算子は?

4

5 に答える 5

4

int配列は魔法のように 0 に設定されていません。Intはデフォルト値 0 の値型ですが、 asMyClassはデフォルト値null.

すべてを初期化して配列を作成したい場合は、流暢な拡張メソッドを使用できます。

public static T[] InitializeAll<T>(this T[] source) where T : new()
{
    if(source != null)
    {
        for(var i = 0; i < source.Length; ++i)
        {
            source[i] = new T();
        }
    }

    return source;
}

var test2 = new MyClass[5].InitializeAll();

または、ループを使用した mandaleeka ソリューション。

編集:Guffaのコメントにはコンテキストが必要なため、元のソリューションを元に戻しています

public static T[] CreateArray<T>(int size) where T : new()
{
     return Enumerable.Repeat(new T(), size).ToArray();      
}
于 2013-06-26T01:09:51.197 に答える
0

これは、値の型と参照の型の違いに関係しています。

「データ型は、独自のメモリ割り当て内にデータを保持する場合、値型です。」一方、「参照型には、データを保持する別のメモリ位置へのポインターが含まれています。」

値のタイプの一般的な例:

  • すべての数値データ型
  • ブール値、文字、および日付
  • メンバーが参照型であっても、すべての構造体
  • 基になる型が常に SByte、Short、Integer、Long、Byte、Short、UInteger、または ULong であるため、列挙型

参照型の一般的な例:

  • 要素が値型であっても、すべての配列
  • Formなどのクラスの種類
  • デリゲート

すべての値型はデフォルト値 (数値型の場合はゼロ) に初期化され、参照型は を指しnullます。

以下の宣言:

int num;

変数を初期化しませんnum。したがってnum、使用できません。C# では、各変数を使用する前に何らかの値 (nullまたは数値) に設定する必要があります。

同じことが参照型にも当てはまります。

//un-initialized, therefore cannot be used until a value is given(A compiler error will occur)
string str;

ただし、次の宣言:

int[] numbers = new int[5];

配列が初期化され (したがって、配列のコンストラクターが呼び出され)、各要素が int の既定値 (つまりゼロ) に初期化されます。

参照型で同じメソッドを使用すると、同じ結果が得られます。

string[] strings = new string[5];

配列が初期化されるため、null文字列の配列が作成されます (これはすべての参照型の既定値です)。

構造体は、探しているデータ型です。構造体は値型であるため、 に設定することはできませんnull。に設定できないためnull、何らかのデフォルト値が必要です。デフォルト値は、デフォルト コンストラクターによって決定されます。

構造体は次のように定義できます。

struct MyStructName
{
    //Members of the struct, like a class, default value is 0.
    int myNumber;

    //Structs can have members whose data type is a reference type
    //Default value is null.
    string myString;

    //Every struct has a default constructor, though you cannot define one.
    //The compiler generates one for you that initializes every member to it's
    //default value.

}

これにより、に設定できないメンバー myNumber および myString を含むデータ型が定義されnullます。

//Array of MyStructName, the default constructor is called and each value is initialized
MyStructName[] data = new MyStructName[5];

//Loop and print results
for(int i = 0; i < data.Length; i++)
{
    //Prints the index, number and the string or "null"
    Console.WriteLine("{0}: myNumber: {1}, myString: \"{2}\"", i, data[i].myNumber, data[i].myString != null ? data[i].myString : "null"); 
}
于 2013-06-26T01:54:02.483 に答える