c#不能将struct添加到列表中

时间:2014-10-29 16:09:14

标签: c# struct

我有

struct Park
{
...
}

我需要将此结构的10个元素添加到List。

        public List<Park> Parks = new List<Park>();
        static void Main(string[] args)
        {
            new Program().CreatePark();
...
        }

        public void CreatePark()
        {
            for (int i = 1; i <= 10; i++)
            {
                Park temp = new Park();
                temp.ID = i;
                temp.Number = "abc";
                temp.Property = false;
                try
                {
                    Parks.Add(temp);
                }
                catch (ArgumentException)
                {
                    Console.WriteLine("oh no :(");
                }
                Console.WriteLine(temp.ToString());
            }
        }

这不起作用。 Console.WriteLine(temp.ToString()); - 这显示了struct元素,但是当我想打印所有元素时,来自Parks它不起作用。 Parks.Count显示为0.

2 个答案:

答案 0 :(得分:0)

鉴于您正在使用语句:new Program().CreatePark();,您创建的对象列表在创建后无法访问。您已经丢弃了持有List的对象的实例。您无法访问您创建的列表以了解其中包含的内容。

其余代码可能做的唯一事情是创建一个完全独立的实例,该实例具有自己的列表,一个与您填充的列表完全不同。

如果要在填充后检查列表,则需要保留对Program对象的引用。

答案 1 :(得分:0)

Parks是一个实例变量。

CreateParks是一种实例方法。

Main是静态方法,因此您无法从中访问实例方法或变量。

new Program()创建Program类的新实例。

由于新创建的程序未存储在变量中,因此会将其丢弃,之后您无法访问其Parks列表。

要访问Parks列表,您需要保留对程序类实例的引用,如下所示:

Program program = new Program();
program .CreateParks();
foreach(Park park in program .Parks)
{
  // Do something with the park
}

除了简单的程序之外,您最好拥有与在Program类之外启动程序无关的所有逻辑。

例如,您可以创建一个新的ParkManager类,该类负责创建园区并提供对它们的访问。

你的程序看起来有点像这样:

public static class Program
{
    static void main(string[] args)
    {
        ParkManager parkManager = new ParkManager();
        parkManager.CreateParks();
        foreach (Park park in parkManager.Parks)
        {
            // do something with park

        } 
    }
}

public class ParkManager
{
    // Setter is private to prevent other classes from replacing the list
    // This doesn't prevent other classes from adding or removing,
    // replacing or editing items in the list
    public List<Park> Parks {get; private set;}

    // Constructor - you could populate the list from here if appropriate
    public void ParkManager()
    {
        Parks = new List<Park>();
    }

    public void CreateParks()
    {
      // Populate the list of parks here
    }
}