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

本文关键字:一个对象 何通过 | 更新日期: 2023-09-27 18:35:03

我知道这两个对象指向相同的引用,但我不希望这种情况发生,所以我对如何防止一个改变另一个有点困惑。 我是否需要声明一个乐队新车对象,例如Car car2 = new Car();? 当我这样做时,锐化器告诉我这是不必要的。 这是我的代码:

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

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

当我这样做时,锐化器告诉我这是不必要的

那么在这种情况下,Resharper将是错误的。但这取决于您的确切代码。

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

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

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

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

正如你提到的,car2 和 car 指的是同一个对象。听起来好像你不想这样,所以你需要创建一个 car 的副本并将其命名为 car2。

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

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

然后像这样使用它:

Car car2 = new Car(car);

你可以把 Car 变成一个结构体

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

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