5

我不知道以前是否有人问过这个问题,但我们今天在我的工作中讨论了这个问题。私有变量(共享/静态)是否应该在它们被标注/定义时被实例化,或者在构造函数中这样做是更好的做法?

例如,这对我来说似乎很好......

Public Class IpCam

    Private Const HOST As String = "http://test.com/url/example"
    Private Shared _Example As New OurClass(HOST)

    Public Shared ReadOnly Property Example() As OurClass
        Get
            Return _Example
        End Get
    End Property
End Class

但是其他人告诉我应该这样做......

Public Class IpCam

    Private Const HOST As String = "http://test.com/url/example"
    Private Shared _Example As OurClass

    Public Sub New()
        _Example = New OurClass(HOST)
    End Sub

    Public Shared ReadOnly Property Example() As OurClass
        Get
            Return _Example
        End Get
    End Property
End Class

有什么不同?对于使用哪一个有共同的共识吗?

4

4 回答 4

3

这真的是一个偏好问题。我认为更重要的是一致性:如果您在内联实例化一些变量,而在构造函数中实例化其他变量,则可能会更难维护,因为不清楚在哪里实例化了什么。

一个好主意是将变量声明保留在构造函数的上方(这样您就不必四处寻找所有变量实例),并内联实例化所有内容。对于那些需要更复杂初始化代码的少数对象,您可以使用构造函数。

于 2010-06-24T18:06:59.493 回答
0

我想知道您的第二个示例是否是旧 VB6 时代的遗留物,当时良好的做法意味着通常避免As New声明,因为它不是最佳的(自动实例化意味着每次运行时检查)并且您永远无法可靠地测试实例Is Nothing等.

于 2010-06-25T09:32:20.963 回答
0

成员变量在构造函数之前初始化;否则其他一切都是等价的,所以这完全取决于你。我会选择更清晰/可维护/导致更少错误的东西。

于 2012-03-03T03:29:41.990 回答
-1

内联初始化变量的一个好处是您不必记住将初始化放在每个构造函数中,或者确保每个其他构造函数调用具有初始化的构造函数。以这段代码为例:

Public Class Person

    Public Sub New()
        _name = "asdlfkj"
    End Sub
    Public Sub New(ByVal age As Integer)
        _age = age
    End Sub

    Private _name As String
    Public ReadOnly Property Name As String
        Get
            Return _name
        End Get
    End Property

    Private _age As Integer = 17
    Public ReadOnly Property Age As Integer
        Get
            Return _age
        End Get
    End Property
End Class

调用第一个构造函数将输入默认名称,但调用第二个不会。

相反,如果您需要为不同的构造函数以不同的方式初始化变量,我肯定会说在构造函数中进行初始化。

于 2010-07-21T04:19:51.680 回答