0

假设您有一个名为 Car 的类。现在通常,如果你想设置 Car 的一个实例等于另一个实例,你会这样做:

Car car1 = new Car();
Car car2 = new Car();

car1 = car2;

现在,如果您想要一种方法来做到这一点怎么办?

Car
{
 public void SetEqualToReference(Car reference)
 {
  this = reference;
 }
}

然后你会做

car1.SetEqualToReference(car2);

car1 将等于 car2。但如你所知,这是行不通的。有没有办法做类似的事情?

4

3 回答 3

2

在阅读您的评论后,保存和打开对象的序列化版本是您真正想要做的,我提供了这个答案。

Save方法总是一样的:

class Car {

  public void Save(String fileName) {
    // Serialize the fields of the current instance to the file.
  }

}

要从序列化数据初始化新实例,您可以使用构造函数:

class Car {

  public void Car(String fileName) {
    // Initialize a new instance from the serialized data in the file.
  }

}

另一种选择是提供静态工厂方法:

class Car {

  public static Car Open(String fileName) {
    var car = new Car();
    // Initialize the new instance from the serialized data in the file.
    return car;
  }

}

要点是“打开”方法不是Car实例上的方法。它应该是构造函数或静态方法。然后,您不必“在内部将对象设置为等于引用”(无论如何这是不可能的)。

在某些方面,您在问题中提出的思路类似于基于原型的编程。但是,C# 是一种基于类的语言,而不是基于原型的语言。

于 2013-05-13T20:45:35.230 回答
1

已经有一种方法可以将引用分配给另一个对象。它称为 operator=,并=以语言实现,就像您在问题中所写的那样:

car1 = car2

Jon Skeet 很好地解释了引用和对象本身之间的区别。我认为您可能对对象和对对象的引用之间的区别缺乏了解,但我可能错了。如果您告诉我们您要做什么以及为什么,我们可能会以更好的方式指导您:)

根据您的评论更新:

我建议在 Car 类上创建一个静态工厂方法,如下所示:

class Car {

public static Car Open(string fileName) {
    return (Car) binaryFormatter.DeSerialize(File.Open(fileName));
}

然后你可以说:

Car car = new Car();
car.Save(fileName);
car = Car.Open(fileName) // re-reads the car from file
于 2013-05-13T20:34:19.847 回答
0

“我想要做的是添加一个“打开”函数,它将对象设置为等于它从我之前使用保存函数写入的文件中读取的类。

您可以将 Open() 设为 Car 类的静态函数,并让它返回一个表示打开文件的NewCar c = Car.Open("somefile.txt");实例:使用如下代码:

public class Car
{

    // ... bunch of members for Car ...

    public static Car Open(string FileName)
    {
        Car c = new Car();
        // ... open the file and populate "c" ...
        return c;
    }

}

另一种选择是将文件名传递给 Car 的构造函数,它将从那里填充。但是,您需要 Car 中的某种“有效”字段来指示文件的打开是否成功。

于 2013-05-13T20:48:41.153 回答