在Win forms vb.net应用程序中,在窗体(而不是全局变量类)之间共享变量数据

在Win forms vb.net应用程序中,在窗体(而不是全局变量类)之间共享变量数据,vb.net,winforms,Vb.net,Winforms,目前在Win Form应用程序中,im使用一个全局变量类,该类包含用于共享数据的变量。我的问题是,还有什么其他方法可以实现这一目标?最佳实践?为什么呢?数据应该根据使用方式进行共享。如果在整个应用程序中需要一个变量,那么可以看到它具有全局范围,全局变量概念(例如公共静态共享)可能非常合适 但通常情况并非如此,因为应该真正避免使用全局变量(查看并获取更多推理) 数据应封装在所需的级别-例如,如果表单中包含适用于其功能的数据/变量,但其他表单需要使用该值,则这将是表单上公共只读属性的理想情况,这将掩

目前在Win Form应用程序中,im使用一个全局变量类,该类包含用于共享数据的变量。我的问题是,还有什么其他方法可以实现这一目标?最佳实践?为什么呢?

数据应该根据使用方式进行共享。如果在整个应用程序中需要一个变量,那么可以看到它具有全局范围,全局变量概念(例如公共静态共享)可能非常合适

但通常情况并非如此,因为应该真正避免使用全局变量(查看并获取更多推理)


数据应封装在所需的级别-例如,如果表单中包含适用于其功能的数据/变量,但其他表单需要使用该值,则这将是表单上公共只读属性的理想情况,这将掩盖应用程序其余部分中变量的实际细节。

全局变量是不好的,原因有很多,但最明显的原因可能是,理想情况下,每次调用相同的方法,传递相同的参数,它都应该用相同的结果做相同的事情。环球航空公司打破了这一规则。突然,您的代码开始以不可预知的方式运行,因为某些东西在其他地方没有正确初始化,或者某些全局代码被错误地修改

我发现,摆脱对globals的需求的最好方法是坚持依赖注入(DI)的原则。在线上有很多关于这个主题的资料,但简而言之,与其让类自己去创建或查找它们的依赖项,不如简单地请求向它们提供依赖项,通常是在构造函数中。根据定义,通过全局变量访问的任何内容都将被视为访问它们的类的依赖项。因此,例如,不要像下面这样拥有全局设置对象:

Global settings As New Settings()
Public Class MyClass
    Public Sub DoSomething()
        If settings.SomethingEnabled Then
            ' ...
        End If
    End Sub
End Class
Public Class MyClass
    Public Sub New(settings As Settings)
        _settings = settings
    End Sub

    Private _settings As Settings

    Public Sub DoSomething()
        If _settings.SomethingEnabled Then
            ' ...
        End If
    End Sub
End Class
然后是这样使用它的类:

Global settings As New Settings()
Public Class MyClass
    Public Sub DoSomething()
        If settings.SomethingEnabled Then
            ' ...
        End If
    End Sub
End Class
Public Class MyClass
    Public Sub New(settings As Settings)
        _settings = settings
    End Sub

    Private _settings As Settings

    Public Sub DoSomething()
        If _settings.SomethingEnabled Then
            ' ...
        End If
    End Sub
End Class
你应该这样做:

Global settings As New Settings()
Public Class MyClass
    Public Sub DoSomething()
        If settings.SomethingEnabled Then
            ' ...
        End If
    End Sub
End Class
Public Class MyClass
    Public Sub New(settings As Settings)
        _settings = settings
    End Sub

    Private _settings As Settings

    Public Sub DoSomething()
        If _settings.SomethingEnabled Then
            ' ...
        End If
    End Sub
End Class

这使您的代码更干净、更灵活、更可靠。它还使代码更易于测试,这是一个巨大的附加好处。

我认为您的编程方式是错误的。在过程程序(和许多非托管应用程序)中,您有全局变量类或模块。这并不好,只要稍作更改,应用程序的状态就很容易损坏。更好的方法是以面向对象的方式将变量限制在所需的范围内&使用App.Config。@Jeremythonpson App.Config是全局状态:)是的,我在暗示OP将全局设置(如连接字符串)放在App.Config中。@Jeremythonpson我想我同意你的做法。我只是讨厌App.config的使用方式,通常,在某些类库的深处,它直接从App.config中读取,而您不知道,并且根据找到的内容采取不同的操作。这样做违背了DI的每一个原则,和globals一样糟糕,但它甚至在.NET框架中也非常普遍!当然,我使用App.config只是为了保持一致性和方便,但我总是加载所有设置一次,然后根据需要传递它们。+1使用这种方法很容易实现一个接口(DoSomething),以支持单元测试模拟。ps我总是发现模仿配置/全局设置在单元测试中扮演着重要角色。。。