Свойства класса… вызывается ли GET при каждом создании экземпляра класса

#vb.net #class #instantiation

#vb.net #класс #создание экземпляра

Вопрос:

У меня есть класс «Настройки», который представляет собой глобальный доступный набор свойств в моем приложении для настроек каждого пользователя. Он создается путем передачи пользовательской строки в New подпрограмму, чрезвычайно упрощенную до:

 Class Settings
    Property This as string
    Property That as string
    Sub New(User as string)
        ' Get new things from the database and set the properties
    End Sub
End Class
  

У меня есть свойство, Websites которое представляет собой коллекцию Website объектов, поэтому более полной моделью моего класса является

 Class Settings
    Property This as string
    Property That as string
    Property Websites as List(of Website)
    Sub New(User as string)
        ' Get new things from the database and set the properties
    End Sub
    Class Website
        Property Domain as string
        '.... more properties
    End Class
End Class
  

Получение свойства websites занимает немного времени, поэтому для повышения производительности я бы хотел, чтобы это свойство заполнялось только при необходимости.

Итак, я записываю это свойство следующим образом:

 ReadOnly Property Websites() As List(Of Website)
    Get
        If Me.UserKey = "" Then ' Checks if the Parent Class `Settings` exists as an object and has a UserKey
            Throw New Exception("Cannot Fetch Website Objects with no valid Settings Object.")
        End If
        Dim w As List(Of Website) = ' Go to the database and make website objects 
        Return w
    End Get
End Property
  

Мой вопрос в том… будет ли это свойство заполняться при каждом вызове New Settings(User) , что противоречит моей цели, или оно останется null до тех пор, пока оно мне не потребуется и я не использую его в коде, таком как

 Dim Settings as New Settings(User)
Dim MyWebsiteList as List(of Website) = Settings.Websites
'   Do things with the websites
  

Или … я все делаю неправильно и должен просто создать функцию в классе settings и передать в нее ссылку на пользователя…

Комментарии:

1. будет ли это свойство заполняться при каждом вызове новых настроек (User) : Да. Вы могли бы кэшировать его в поле и возвращать поле, если это не так Nothing , вместо того, чтобы обращаться к базе данных. Я бы посоветовал взглянуть на Lazy класс, хотя, как я полагаю, он будет делать то, что вы хотите.

2. О, Lazy выглядит интересно. Я с этим раньше не сталкивался.