3

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

这是代码:

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();
    }
}

输出是这样的:

1993日产240SX

2001五十铃牛仔竞技表演

2010福特平托

2010福特平托

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

提前感谢您的帮助。

4

3 回答 3

5

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

当你调用这行代码时:

oneCar = manyCars[2];

您指向oneCar的内存位置manyCars[2]。它们引用的是同一个对象。更新oneCar也更新manyCars[2]

这个链接有一个很好的关于引用和值类型的文章。

于 2012-10-02T22:19:31.950 回答
3

manyCars[2]是福特。所以分配后oneCar是同一个福特。但请记住,类类型是引用类型。这意味着oneCarmanyCars[2]指向同一个汽车对象!因此设置与设置oneCar.model = "Pinto"具有相同的效果manyCars[2].model = "Pinto"

oneCar = manyCars[2];不会创建对象内容的副本。您可以向汽车类添加一个Clone方法

public Cars Clone()
{
    return (Cars)MemberwiseClone(); // This method is inherited from object.
}

那么这真的会创建一个副本

oneCar = manyCars[2].Clone();

现在oneCarmanyCars[2]是两个不同的对象,更改oneCar's模型不会影响manyCars[2].

于 2012-10-02T22:23:52.893 回答
2

在 c# 中有值和引用类型——类是引用类型。您上面的代码将三个新的汽车对象添加到 ManyCars 列表中 - 然后将 OneCar 变量设置为第三个列表元素的引用 - 在您的情况下为 F150。然后,您使用 Pinto 覆盖模型属性,然后遍历您的列表。

您基本上已将 OneCar 设置为指向原始 Car 对象的指针。如果要复制对象,然后可以更改而不影响 List 中的原始对象,则需要克隆 Car 对象,而不仅仅是将其分配给 OneCar 变量。

干杯西蒙

于 2012-10-02T22:33:47.743 回答