3

Tagsこのコードの実行後にプロパティがBook空になるのはなぜですか?

class Program
{
    static void Main(string[] args)
    {
        List<Book> books = new List<Book>();
        List<String> tags = new List<String> {"tag1", "tag2", "tag3"};
        String title = "a title";
        books.Add(new Book
        {
            Title = title,
            Author = "an author",
            Tags = tags
        });
        Console.WriteLine("(" + title + ")");
        Console.WriteLine((books[0]).Tags.Count());

        title = String.Empty;
        tags.Clear();

        Console.WriteLine("(" + title + ")");
        Console.WriteLine((books[0]).Tags.Count());
    }
}

のコードBook:

public class Book
{
    public String Title { get; set; }
    public String Author { get; set; }
    public List<String> Tags { get; set; }
}

このコードの出力を実行すると

("a title")
3
()
0

ここで参照渡しされていますtagsか?titleそれぞれのプロパティの名前を変更すると、同じ出力が生成されます。

編集:

Console.WriteLineタグだけでなく、すべてのステートメントがオブジェクトを参照することを意味していたことに気付きました。私はこれを意味しました:

Book aBook = books[0];
Console.WriteLine("(" + aBook.Title + ")");
Console.WriteLine(aBook.Tags.Count());

title = String.Empty;
tags.Clear();

Console.WriteLine("(" + aBook.Title + ")");
Console.WriteLine(aBook.Tags.Count());

予想通り、出力:

("a title")
3
("a title")
0

しかし、最初の質問を間違えたので、参照する回答の部分がtitle元のコードを参照しているため、そのままにしておきます。

4

3 に答える 3

5

List<T>は参照型なので、はい、ここで参照セマンティクスを取得します。

それらを独立させたい場合は、プロパティにのコピーを割り当てる必要があります。tags

Tags = new List<string>(tags);
于 2012-07-12T16:27:23.790 に答える
1

オブジェクトのTagsプロパティは、コードの 2 行目で作成したリストと同じオブジェクト インスタンスBookを参照します ( )。List<String> tags = new List<String> {"tag1", "tag2", "tag3"};

あなたが書いたときTags = tags、あなたは実際にそれが同じインスタンスをTags 指しtagsていると言っています.

同じ object reference であるため、 clear tags,も clearTagsされるのはそのためです。

于 2012-07-12T16:29:40.573 に答える
1

ここでタグとタイトルは参照によって渡されますか?

はい。

ただし、(コメントに基づく)混乱は、コード内での方法TagsTitle動作の違いによるものと思われます。

Tagsとの動作の違いTitle:

title = String.Empty;
tags.Clear();

最初のケースでは、まったく新しいインスタンスをタイトルに割り当てているという事実によるものです。tags.Clear()ただし、を呼び出すと、既存のインスタンスTagsが変更されます。これは、内のプロパティと「共有」されていますbook[0](List<string>はクラスであり、参照型のセマンティクスがあるため)。

于 2012-07-12T16:31:28.717 に答える