【问题标题】:Modifying a class instance from inside the class从类内部修改类实例
【发布时间】:2013-10-21 12:22:02
【问题描述】:

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

[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();

【问题讨论】:

  • 首先,你通常不应该将 I/O 放在构造函数中,其次你不能分配给这个,你需要分别分配给每个字段
  • @RuneFS 但是如果我的字段太多怎么办?
  • @user1492051:然后你写了很多行代码,或者把它抽象成另一个方法。
  • @Jon 最好在调用范围内执行此操作?
  • @user1492051 你真正想要的是factory patternbuilder pattern

标签: c# class constructor this


【解决方案1】:

不,您不能替换对象的 this 引用。您可以按照建议使用 Factory/Builder。

然而,最近反序列化的对象与任何其他对象有一个不同之处:没有其他对象引用它。所以虽然 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);     
   }
}

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

你会的。

【讨论】:

    【解决方案2】:

    您可能想了解工厂:http://www.dotnetperls.com/factory。据我所知,您不能从构造函数中执行此操作。

    另外,请查看此相关帖子:Using this() in C# Constructors

    【讨论】:

    • 您可以(但可能不应该)从构造函数中执行此操作,而您的答案并不能真正提供答案
    • 您可以通过分别分配给每个字段来做到这一点。如果它是一个结构,它也可以工作。
    • 是的,你可以做很多事情。但是,您没有选择任何可能的选项,因此没有提供问题的解决方案。你的评论没有错,我只是说它没有给 OP 提供任何具体建议,但更糟糕的是,实际信息在另一个网站上,这使得这个答案成为一个短暂的答案,因为在某些时候(并且通常比预期更快)第一个链接会死。第二个没有提供解决方案
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多