代码之家  ›  专栏  ›  技术社区  ›  Josh Stodola

私有变量实例化:何时定义或在构造函数内?

  •  5
  • Josh Stodola  · 技术社区  · 14 年前

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

    例如,我觉得这很好…

    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 回复  |  直到 9 年前
        1
  •  3
  •   user315772    14 年前

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

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

        2
  •  0
  •   onedaywhen    14 年前

    我想知道你的第二个例子是否是旧的vb6时代遗留下来的,良好的实践通常意味着避免 As New 声明是因为它不是最佳的(自动实例化意味着每次都要进行运行时检查),并且您永远无法可靠地测试实例 Is Nothing 等。

        3
  •  0
  •   user370770    9 年前

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

        4
  •  -1
  •   Gideon Engelberth    14 年前

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

    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
    

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

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