我一直在为我在学校的c#课程做一个项目。我认为我有一个非常简单的问题。但我无法在任何地方找到答案。我不断得到关于如何制作结构列表的结果。我想知道如何访问结构中的列表?
所以这是我们老师给我们的结构,我们必须用于此作业:
[Serializable]
struct Name
{
public string firstName;
public string lastName;
}
[Serializable]
struct Movie
{
public string title;
public string year;
public Name director;
public float quality;
public string mpaaRating;
public string genre;
public List<Name> cast;
public List<string> quotes;
public List<string> keywords;
}
struct MovieList
{
public int length;
public Movie[] movie;
}
现在我尝试通过以下两种方式访问引号和关键字,并且两者都产生了错误:
1
string quotes;
MovieList ML = new MovieList();
quotes = Console.ReadLine();
ML.movie[0].quotes[0] = quotes;
2
string quotes;
MovieList ML = new MovieList();
quotes = Console.ReadLine();
ML.movie[0].quotes.Add(quotes);
答案 0 :(得分:2)
struct是Value
类型,因此,使用struct来携带所有这些信息会使效率非常低,因为每次将它作为参数传递时,都需要复制struct的全部内容等等,更好的方法是使用一个类,它是Reference
类型,它的参考是传递的内容。
至于如何访问结构成员,这是一个例子:
MovieList m =new MovieList();
m.movie = new Movie[10];
m.movie[0].title="The Girl with the Dragon Tatoo";
Console.WriteLine(m.movie[0].title); //The Girl with the Dragon Tatoo
更新:
显示如何访问引号:
MovieList m =new MovieList();
m.movie = new Movie[10];
m.movie[0].title="The Girl with the Dragon Tatoo";
m.movie[0].quotes = new List<string>();
m.movie[0].quotes.Add("Hello World");
Console.WriteLine(m.movie[0].title); //The Girl with the Dragon Tatoo
Console.WriteLine(m.movie[0].quotes[0]); //Hello World
答案 1 :(得分:1)
您的MovieList
结构包含Movie
数组。该数组尚未初始化。
为什么不只是制作List<Movie>
而不是单独的结构或类?
答案 2 :(得分:0)
感谢您对您的作业诚实。我看到的第一个问题是你在初始化之前尝试使用列表。在结构内部,全新的列表引用null。你必须初始化它们。请对结构初始化进行研究。
答案 3 :(得分:0)
制作这些类而不是结构。对于MovieList类中的每个Movie,您必须创建一个新的Movie实例,以便添加到引号列表中。否则它不会被初始化。
答案 4 :(得分:0)
结构通常应该避免暴露可变类类型的字段或属性,除非结构将由仅对其中提到的对象的身份感兴趣的代码使用,而不是他们的内容。假设有一个结构m1
,其中包含有关某些电影的信息,m2
最初为空白。如果执行代码:
m2 = m1; m2.year = 2012; m2.keywords.Add("dinosaur")
然后m1.year
将不会被修改,但m1.keywords
会添加“恐龙”(因为m1.keywords
和m2.keywords
都引用相同的可变List<string>
}。
对于用作数据持有者的结构体来说,暴露逻辑不可变类类型的读写字段,或者不包含任何可变类类型的值类型,但是包含可变引用类型的结构通常很奇怪语义学,在实际应该避免。