从类内部修改类实例

本文关键字:实例 修改 内部 | 更新日期: 2023-09-27 18:36:19

假设我有一个可序列化的类,例如

[Serializable]
    public class DatabaseViewModel:MVVM.ObservableObject 
    {
        //fields
        //properties
        public DatabaseViewModel()
        {
           //if a serialization file exists then deseralize and make this instance equal to it
           //else initialize fields
        }
    }

是否可以从类内部而不是调用范围执行此类操作?

在调用范围内,我会做

var dbvm = new DatabaseViewModel();

然后我希望构造函数决定它应该创建一个新对象还是加载一个序列化的对象。

在我的课堂上,我试过这个

this = //my serialized object 

如果我想从调用范围执行此操作,我会这样做

DatabaseViewModel dbvm = null;
if(File.Exists(".../DatabaseViewModel.bin")
dbvm = //deserialize .../DatabaseViewModel.bin
else
dbvm = new DatabaseViewModel();

从类内部修改类实例

不,您不能替换对象的this引用。您可以按照建议使用工厂/制造商。

但是,最近反序列化的对象与任何其他对象有一个区别:没有其他人引用它。因此,虽然是不可能的:

class MyClass
{
    public MyClass(MyClass arg)
    {
       this = arg;
    }
}

这是可能的

class MyClass
{
   public MyClass(MyClass arg)
   {
      this.CopyFrom(arg);
   }
   void CopyFrom(MyClass m)
   {
      // Assign fields from m.
   }
}

现在,如果您将要复制的参数对象替换为查找反序列化数据并在内部反序列化所需的内容:

class MyClass
{
   public MyClass(int id)
   {
      if (FileExistsOnDisk(id))
      {
         MyClass m = DeserializeFromFile(id);
         CopyFrom(m);
      }
      else
      {
          // Normal construction.
      }
   }
}
但是,您无论如何都

不想将持久性逻辑和 IO 保留在构造函数中,因此只需在对象的创建或反序列化之间进行选择,即可获得更好的设计,由其他对象(例如工厂/构建器)负责。

public class MyClassFactory
{
   public MyClass GetObj(int id)
   {
      if (FileExistsOnDisk(id))
         return DeserializeFromFile(id);
      else 
         return new MyClass(id);     
   }
}

"如果我想从调用范围执行此操作,我会这样做"

而你做到了。

你可能想看看工厂:http://www.dotnetperls.com/factory。据我所知,你不能从构造函数中做到这一点。

另外,请查看此相关文章:在 C# 构造函数中使用 this()。