C#奇数列表行为

Mik*_*nes 3 c# pointers list

这可能有点像一个愚蠢的问题,但我似乎根本找不到任何关于这种行为的信息.

这是代码:

class Cars
{
    public int year = 0;
    public string make = " ";
    public string model = " ";

    public Cars()
    {
    }

    public Cars(int tYear, string tMake, string tModel)
    {
        year = tYear;
        make = tMake;
        model = tModel;
    }

    public string ConvertToString()
    {
        return year.ToString() + make + model;
    }
}

class Program
{
    Cars oneCar = new Cars();
    List<Cars> manyCars = new List<Cars>();

    public void Init()
    {
        manyCars.Add(new Cars(1993, "Nissan", "240SX"));
        manyCars.Add(new Cars(2001, "Isuzu", "Rodeo"));
        manyCars.Add(new Cars(2010, "Ford", "F150"));

        oneCar = manyCars[2];
        oneCar.model = "Pinto";

        for (int i = 0; i < manyCars.Count(); i++)
            Console.WriteLine(manyCars[i].ConvertToString());

        Console.WriteLine(oneCar.ConvertToString());
    }

    static void Main(string[] args)
    {
        Program prg1 = new Program();
        prg1.Init();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

1993Nissan240SX

2001IsuzuRodeo

2010FordPinto

2010FordPinto

为什么第三行读取Pinto而不是F150?它似乎是将oneCar变量设置为指针或其他东西.如何避免这种情况?我认为这就是"新"关键字的成就.

在此先感谢您的帮助.

Dav*_*ych 5

因为Cars是一个对象,而对象是Reference Types在C#中.

当你调用这行代码时:

oneCar = manyCars[2];
Run Code Online (Sandbox Code Playgroud)

你指向oneCar的内存位置manyCars[2].它们引用相同的对象.更新oneCar也更新manyCars[2].

此链接对Reference和Value类型有很好的写法.