有没有办法在内部设置一个对象等于一个引用?

本文关键字:于一个 引用 一个对象 设置 在内部 有没有 | 更新日期: 2023-09-27 18:13:17

假设您有一个名为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。但如你所知,这行不通。有没有类似的方法?

有没有办法在内部设置一个对象等于一个引用?

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

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

要点是"Open"方法不是Car实例上的方法。它应该是一个构造函数或静态方法。这样你就不必"在内部设置一个对象等于一个引用"(这是不可能的)。

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

已经有一个方法可以将引用赋值给另一个对象。它被称为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

"我想做的是添加一个"open"函数,它将对象设置为它从我之前使用save函数写入的文件中读取的类。"

你可以让Open()成为class Car的一个static函数,并让它返回一个代表打开的文件:Car c = Car.Open("somefile.txt");New实例,代码如下:

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中使用某种"有效"字段来指示文件打开是否成功。