c#类之间通信的最佳方式

时间:2012-08-31 07:56:43

标签: c#

现在我正在编写一个应用程序,并且我认为必须有一个更好的解决方案来解决我现在正在做的事情。

我有一个主窗口,可以处理程序的设置。然后我有更多的课程和窗口。例如,语言处理程序类和处理“main函数”所需的用户输入的表单。

但是,到目前为止,我总是必须将主窗口传递给每个类,因为语言处理程序应该能够更改主窗口的字符串。另一种形式也应该能够将数据传递给主窗口。

如果我们想象会有更多的类,并且每个类都需要主窗口的副本,这将消耗大量资源,具体取决于主窗口的“大小”。

那么,是否有更好/更有效的方法在这些类之间进行通信。

4 个答案:

答案 0 :(得分:10)

这样做的常用方法是使用observer pattern,它在.NET中为events system。简单地说,您的类订阅彼此的事件并在事件发生时执行操作。正如注释中所指出的,传递引用并不是内存繁重,但它会导致代码的不同部分之间的紧密耦合 - 观察者模式解决了这个问题。

答案 1 :(得分:3)

另一种选择是将您的课程视为服务。将它们编码到接口,然后使用dependency injection(又名控制反转)来构建对象图(您告诉IoC容器您需要frmSomething,它将确定它需要哪些服务/类,适当地实例化它们。

这意味着:

  • 您只需要针对接口而不是实现进行编码
  • 您的代码是松散耦合的(您可以将OldTranslator交换为NewTranslator,只要它们都符合相同的界面,除了容器的配置之外不需要更改任何内容)< / LI>
  • 您可以开发依赖于尚未编写的服务且代码将编译的高级功能
  • 您可以通过更改容器中注册的类/服务,在运行时根据需要轻松更改应用的工作方式。

查看MS支持的DI容器UnityCastle Windsor是一种受欢迎的选择,但还有更多

值得注意的是,正如你所说的那样传递主窗口的“复制”并不是一件坏事 - 你只是将一个引用(实际上是一个指针)传递给主窗口(因为任何比真实基元更复杂的是引用类型)。这意味着无论如何都有很小的开销

答案 2 :(得分:2)

我建议你使用GalasoftPrism MVVM实现。在那里,您可以使用非常容易使用的消息服务。需要信息的类只是向订阅者发送消息,然后他们可以发送所需的所有数据。我认为这是处理沟通的最简单方法。

答案 3 :(得分:2)

除了IVAN给出的ans之外..如果我们在没有所有这些术语的情况下查看更高级别的视图,那么你应该创建一个静态类,它将服务器作为InMemoryStorage并在其上定义字段以保存信息
这就是你将完全控制共享内容以及多个组件可以改变它的内容 此外,您可以定义getter和setter,并在更改属性时引发事件,以便不同的表单或窗口(视图)可以订阅更改并相应地执行操作