#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 выглядит интересно. Я с этим раньше не сталкивался.