C# 从类内部修改类实例

C# 从类内部修改类实例,c#,class,constructor,this,C#,Class,Constructor,This,假设我有一个可序列化的类,比如 [Serializable] public class DatabaseViewModel:MVVM.ObservableObject { //fields //properties public DatabaseViewModel() { //if a serialization file exists then deseralize and make th

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

[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();
DatabaseViewModel dbvm = null;
if(File.Exists(".../DatabaseViewModel.bin")
dbvm = //deserialize .../DatabaseViewModel.bin
else
dbvm = new DatabaseViewModel();
然后我希望构造函数决定是创建新对象还是加载序列化对象

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

this = //my serialized object 
如果我想在调用范围内执行此操作,我只会执行

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

您可能需要查看工厂:。据我所知,您不能从构造函数中执行此操作


另外,请查看此相关帖子:。

您可能希望查看工厂:。据我所知,您不能从构造函数中执行此操作


另外,请查看此相关帖子:。

否您不能替换对象的
引用。正如建议的那样,您可以使用工厂/建筑商

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

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);     
   }
}
“如果我想从调用范围执行此操作,我会执行”


您可以。

不,您不能替换对象的
引用。正如建议的那样,您可以使用工厂/建筑商

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

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);     
   }
}
“如果我想从调用范围执行此操作,我会执行”


您可以这样做。

首先,您通常不应该将I/O放在构造函数中;其次,您不能分配给它,您需要分配给每个字段seperately@RuneFS但是如果我有太多的字段怎么办?@user1492051:那么你写了很多行代码,或者将其抽象到另一个方法中。@Jon那么最好从调用范围中执行它?@user1492051您真正想要的是或。首先,您通常不应该将I/O放入构造函数中。其次,您不能分配给它,您需要分配给每个字段seperately@RuneFS但是如果我有太多的字段怎么办?@user1492051:那么你写了很多行代码,或者将其抽象到另一个方法中。@Jon那么最好从调用范围中执行它?@user1492051您真正想要的是或。您可以(但可能不应该)从构造函数中执行此操作,并且您的答案并不真正提供答案。您可以通过分别为每个字段赋值来执行此操作。如果它是一个结构,它也可以工作。是的,你可以做很多事情。但是,您没有选择任何可能的选项,因此没有提供问题的解决方案。你的评论没有错,我只是说它没有给OP提供任何具体的建议,但更糟糕的是,另一个网站上的实际信息使得这个答案很短,因为在某个时候(通常比预期的要早)第一个链接会消失。第二种方法不提供解决方案您可以(但可能不应该)从构造函数中执行此操作,而您的答案并不真正提供答案您可以通过分别为每个字段赋值来执行此操作。如果它是一个结构,它也可以工作。是的,你可以做很多事情。但是,您没有选择任何可能的选项,因此没有提供问题的解决方案。你的评论没有错,我只是说它没有给OP提供任何具体的建议,但更糟糕的是,另一个网站上的实际信息使得这个答案很短,因为在某个时候(通常比预期的要早)第一个链接会消失。第二种方法不能提供解决方案