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

时间:2013-05-13 20:28:43

标签: c# winforms visual-studio-2010

假设您有一个名为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。 但是如你所知,这不起作用。有没有办法做类似的事情?

3 个答案:

答案 0 :(得分: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;
  }

}

重点是“Open”方法不是Car实例上的方法。它应该是构造函数或静态方法。然后你不必“在内部设置一个等于引用的对象”(这无论如何都是不可能的)。

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

你可以让Open()成为Car类的静态函数,让它返回一个 New 实例,代表打开的文件:Car 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中使用某种“有效”字段来指示文件的打开是否成功。