Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用属性管理多个Windows_Vb.net_Visual Studio - Fatal编程技术网

Vb.net 使用属性管理多个Windows

Vb.net 使用属性管理多个Windows,vb.net,visual-studio,Vb.net,Visual Studio,我正在用多个表单构建一个应用程序,每个表单都有自己的公共属性。我创建了它们的多个实例,并在用户关闭表单时隐藏表单,以便在内存中维护其属性值。我不想将属性移动到更一致的地方,因为有太多不同的表单,经常访问,我试图保持组织性。我也不想为了存储这些属性值而隐藏所有可能未使用的表单。处理这种情况的最好方法是什么 我希望你能理解我的意思,而不显示任何代码。如果你认为这会有帮助的话,我会很乐意的,但我在这里尽量做到笼统。我认为这更多的是一个方法论问题。一个好方法是使用Memento模式。例如,在伪代码中:

我正在用多个表单构建一个应用程序,每个表单都有自己的公共属性。我创建了它们的多个实例,并在用户关闭表单时隐藏表单,以便在内存中维护其属性值。我不想将属性移动到更一致的地方,因为有太多不同的表单,经常访问,我试图保持组织性。我也不想为了存储这些属性值而隐藏所有可能未使用的表单。处理这种情况的最好方法是什么


我希望你能理解我的意思,而不显示任何代码。如果你认为这会有帮助的话,我会很乐意的,但我在这里尽量做到笼统。我认为这更多的是一个方法论问题。

一个好方法是使用Memento模式。例如,在伪代码中:

假设您有一个具有属性的窗体。表单当然会占用大量的内存,您希望“记住”您的属性,而不是表单

' declare memento interface
Interface IForm1Memento
    ' declare properties here
    . . . . . 
    Sub SetMemento()
    Sub GetMemento()
 End interface    

 ' inherit in form
 public class form form1
     inherits IForm1Memento
     . . . . 
     Sub SetMemento
          dim m As IForm1Memento = MementoFactory.Get(me)
          ' here you can do property by property or create reflection based hydrator
          ' or use AutoMapper (free product) to fill memento object (see below)
          MementoStorage.Store(key, m) ' this could be a global dictionary or cache like nCache
     end sub

     Sub GetMemento
          dim m As IForm1Memento = MementoStorage.Retrieve(key)
          ' again, here hydrate your form from memento
     end sub

 end class


 ' inherit interface in memento object
 public class Form1Memento
     inherits IForm1Memento
     ' here ho same property implementations as in form1
 end class
现在,如果您还使用xml属性装饰您的
Form1Memento
,您可以将其存储在文件系统中,并在下一个应用程序启动时检索它。或者,如果愿意,可以使用JSON


那么,结果是什么呢窗体可以运行、关闭和加载。事实上,您可以在
form.load
上加载memento,然后在
form.closed
上保存。您可以将纪念品保存在文件系统中或存储在内存中—缓存中、字典中、列表中等等。

您已经排除了将它们移动到其他地方的可能性。你知道地区吗?更面向对象的方法是使用类来存储、管理、验证、保存和加载与参与者(客户、玩家、游戏、订单、产品等)相关的数据。那么,表单就是这些东西获取或向用户显示信息的方式,这个问题将无关紧要。我想我理解你的意思。我仍在努力想办法解决这个问题。假设我有一个没有公共属性的frmOne,它什么都不存储,只是一个接口。我可以创建一个名为dataOne的类或其他具有所有公共属性的类,在创建frmOne时调用它们,在保存时写回它们,并在关闭时让frmOne进行处理。有那么简单吗?
dataOne
frmOne
有点太抽象了。想象一个简单的21点游戏。您可能(应该)有一个card类,用于指示卡的
{Rank,Suit,Value,Image}
。很简单。一个甲板类的任务是创建一个52张的集合,洗牌做一只鞋,收集淤泥,和发牌。一个游戏类可以指定某些参数(Easy level=1甲板鞋,Med=3甲板鞋等);它还可以控制是5张牌抽签,7张牌配饰还是德州扑克。现在,一张表格在其中有什么作用呢?这些只是模糊的例子。我只需要把表单想象成更像空的空心壳,然后把属性移出它们,放到它们自己的类中。我相信我知道我现在需要做什么。谢谢。实际上,不要从一个表单或视觉开始,而是从功能开始;应用程序做什么,该功能意味着什么类等。然后构建表单以实现所需的功能。从形式和视觉开始,你有点像是从外到内构建的——这必然会导致瓶颈和障碍。建筑由内而外,形式遵循功能。