4

クラス内でのリストの使用に関するコードサンプルを見つけました。理解できないコードがあります。名前フィールドと説明フィールドはリスト定義内に値がありますが、アルバムフィールドには値がありません。(

new genre { Name = "Rock" , Description = "Rock music", Album?? }

)。なぜ?

public class Genre
{
    public string  Name { get; set; }
    public string  Description { get; set; }
    public List<Album> Albums { get; set; }
}

public class Album
{
    public string  Title { get; set; }
    public decimal  Price { get; set; }
    public Genre  Genre { get; set; }
}

var genre = new List<Genre>
{
    new genre { Name = "Rock" , Description = "Rock music" },
    new genre { Name = "Classic" , Description = "Middle ages music" }
};

new List<Album>
{
    new Album { Title = "Queensrÿche", Price = 8.99M, Genre = genre.Single(g => g.Name == "Rock") },
    new Album { Title = "Chopin", Price = 8.99M, Genre = genre.Single(g => g.Name == "Classic") }
};
4

4 に答える 4

12

このC#構文はと呼ばれObject and Collection initializersます。

これがドキュメントです。

この構文を使用すると、オブジェクトまたはコレクションの初期化中にアクセスできるプロパティを設定できます。

于 2013-03-27T13:44:34.080 に答える
2

これらは、プロパティの迅速な初期化に使用されるオブジェクトおよびコレクションの初期化子です。すべてのプロパティを初期化する必要はありません。必要なプロパティだけを初期化してください。

于 2013-03-27T13:45:47.513 に答える
2

コーダーはその値を設定したくなかったからです。最後にステートメントを追加する場合は、Album = new List()。すべてのプロパティを設定する必要はありません。

于 2013-03-27T13:46:29.863 に答える
2

他の人が述べたように、コードサンプルはオブジェクトとコレクションの初期化子を使用しています。コレクションの場合、イニシャライザーはコレクションのコンストラクターを呼び出してから、中括弧内にリストされている各要素に対して.Add()関数を呼び出します。オブジェクトの場合、Initializerはオブジェクトのコンストラクターを呼び出してから、指定したプロパティの値を設定します。

オブジェクトおよびコレクションの初期化子は、実際に一時変数にオブジェクトまたはコレクションを作成し、その結果を変数に割り当てます。これにより、オールオアナッシングの結果が確実に得られます(つまり、初期化中に別のスレッドからアクセスした場合に、部分的に初期化された値を取得できない場合)。初期化コードは次のように書き直すことができます。

var temp_list = new List<Genre>();
// new genre { Name = "Rock" , Description = "Rock music" }
var temp_genre_1 = new Genre();
temp_genre_1.Name = "Rock";
temp_genre_1.Description = "Rock music";
temp_list.Add(temp_genre_1);
// new genre { Name = "Classic" , Description = "Middle ages music" }
var temp_genre_2 = new Genre();
temp_genre_2.Name = "Classic";
temp_genre_2.Description = "Middle ages music";
temp_list.Add(temp_genre_2);
// set genre to the result of your Collection Initializer
var genre = temp_list;

Albumこのコードは、ジャンルのプロパティの値を明示的に設定しないため、Genreクラスで指定されたデフォルト値(参照型の場合はnull)に設定されます。

于 2013-03-27T14:11:46.603 に答える