修改Struct内部的List

时间:2012-05-05 17:43:32

标签: c# arrays struct

我一直在为我在学校的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);

5 个答案:

答案 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.keywordsm2.keywords都引用相同的可变List<string> }。

对于用作数据持有者的结构体来说,暴露逻辑不可变类类型的读写字段,或者不包含任何可变类类型的值类型,但是包含可变引用类型的结构通常很奇怪语义学,在实际应该避免。