为什么在此代码运行后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());
}
}
Run Code Online (Sandbox Code Playgroud)
代码Book:
public class Book
{
public String Title { get; set; }
public String Author { get; set; }
public List<String> Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
运行此代码输出
("a title")
3
()
0
Run Code Online (Sandbox Code Playgroud)
是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());
Run Code Online (Sandbox Code Playgroud)
如预期的那样,产出:
("a title")
3
("a title")
0
Run Code Online (Sandbox Code Playgroud)
但是因为我在最初的问题中犯了一个错误,所以我将其保留原样,因为title所引用的答案部分都引用了原始代码.
List<T> 是一个引用类型,所以是的,你在这里得到了引用语义.
你需要一个指定副本的tags,如果你想他们是独立的财产.
Tags = new List<string>(tags);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5609 次 |
| 最近记录: |