如何通过更改另一个来阻止更改对象?

时间:2013-10-11 15:07:02

标签: c# .net

我理解这两个对象指向相同的引用,但我不希望如此,所以我对如何防止改变另一个有点困惑。我是否需要声明一个新的Car对象,例如Car car2 = new Car();?当我这样做时,resharper告诉我这是不必要的。这是我的代码:

void Main()
{
    Car car = new Car { Color = "Blue"};

    Console.WriteLine(car.Color);

    //Do I need Car car2 = new Car();
    //car2 = car; //Confused.

    Car car2 = car;

    Console.WriteLine(car2.Color);

    car = Format(car);

    Console.WriteLine(car.Color);
    Console.WriteLine(car2.Color); //How can I prevent car2 from changing color?
}

// Define other methods and classes here
public class Car
{
    public string Color {get;set;}
}

public static Car Format(Car car)
{
    car.Color = "Red";

    return car;
}

 var car2= new Car();
 car2 = car;

 car = Format(car); //This changes car and car2

3 个答案:

答案 0 :(得分:2)

  

当我这样做时,resharper告诉我这是不必要的

然后Resharper在这种情况下会出错。但这取决于您的确切代码。

当你想要car1和car2的颜色不同时,它们应该是不同的实例。这确实需要Car car2 = new Car();

汽车是一类是参考类型 在您发布的代码中只有一个实例,因此只能有一种颜色。

请注意,出于同样的原因,您的Format方法不需要返回任何内容,以下内容将完全相同:

public static void Format(Car car)
{
    car.Color = "Red";
}

答案 1 :(得分:1)

如你所述,car2和car指的是同一个物体。听起来好像你不想要那样,所以你需要创建一个汽车副本并称之为car2。

您可以为Car类定义一个复制构造函数:

public Car(Car car)
{
    this.Color = car.Color;
}

然后像这样使用它:

Car car2 = new Car(car);

答案 2 :(得分:0)

你可以让Car成为一个结构

public struct Car
{
    public string Color { get; set; }
}

或制作Car ICloneable或其他十几种方法来复制对象,这样您就可以轻松拥有另一个实例。我们需要查看显示警告的代码,以便我们找出问题所在。我没有看到警告。