假设您有一个名为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。 但是如你所知,这不起作用。有没有办法做类似的事情?
答案 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中使用某种“有效”字段来指示文件的打开是否成功。