Создание личных переменных: когда определено или внутри конструктора? - PullRequest
5 голосов
/ 24 июня 2010

Я не знаю, спрашивалось ли об этом раньше, но сегодня мы обсуждаем это на моей работе. Должны ли быть созданы частные переменные (которые являются общими / статическими), когда они измерены / определены, или лучше сделать это внутри конструктора?

Например, мне это кажется вполне подходящим ...

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 ]

3 голосов
/ 24 июня 2010

Это действительно вопрос предпочтений. Я думаю, что важнее согласованность: если вы создаете несколько встроенных переменных, а другие - в конструкторе, поддерживать их становится сложнее, поскольку неясно, что и где создается.

Хорошая идея - держать объявления переменных чуть выше вашего конструктора (чтобы вам не приходилось прыгать, чтобы найти все экземпляры переменных), и инстанцировать все внутри. Для тех немногих объектов, которые требуют более сложного кода инициализации, вы можете использовать конструктор.

0 голосов
/ 03 марта 2012

Переменные-члены инициализируются перед конструктором; в противном случае все остальное эквивалентно, так что это полностью зависит от вас. Я бы пошел на то, что является более разборчивым / поддерживаемым / приводит к меньшему количеству ошибок.

0 голосов
/ 21 июля 2010

Одним из преимуществ инициализации переменных в строке является то, что вам не нужно не забывать помещать инициализацию в каждый конструктор или убедиться, что каждый другой конструктор вызывает тот, который инициализируется.Возьмем, к примеру, этот код:

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

При вызове первого конструктора будет введено имя по умолчанию, но при вызове второго не будет.

И наоборот, если вам когда-нибудь понадобится инициализировать переменнуюпути для разных конструкторов, я бы определенно сказал, чтобы инициализировать в конструкторе.

0 голосов
/ 25 июня 2010

Интересно, является ли ваш второй пример похмелья со старых дней VB6, когда хорошая практика означала, как правило, избегать объявлений As New, потому что они не были оптимальными (автоматическое создание экземпляров означало проверку во время выполнения каждый раз), и вы никогда не моглинадежно протестировать экземпляр на Is Nothing и т. д.

...