我是vb.net中的新手我正在尝试优化我正在处理的代码执行。我正在制作一个有超过45种表格的节目。在每种形式中,调用功能IsPowerUser来检查是超级用户
如果我们可以在登录时存储有关用户的所有详细信息,那么我们需要在每次需要时使用这些值,而不是从数据库中收集数据。可能这个问题属于VB Basics。
答案 0 :(得分:0)
您可以使用延迟初始化来推迟数据库调用,直到您确实需要该信息(如果有的话),然后存储该值以便重复使用。
Private _isPowerUser As New Lazy(Of Boolean)(AddressOf GetIsPowerUser)
Public Function IsPowerUser() As Boolean
Return _isPowerUser.Value
End Function
Private Function GetIsPowerUser() As Boolean
' Retrieve the information from the database and return
Return True Or False
End Function
在此示例中,_isPowerUser
是使用延迟初始化的支持字段。当有人呼叫IsPowerUser
时,它首先被初始化。在幕后,Lazy(Of T)
然后调用代理GetIsPowerUser()
来执行所有繁重的工作以从数据库中检索值。
Lazy(Of T)
只需拨打一次GetIsPowerUser()
即可。
换句话说:对IsPowerUser()
的任何连续调用都不会触发GetIsPowerUser()
。
编辑(1/2)
直到.NET 4才引入 Lazy(Of T)
,所以这里有一个适用于.NET 2及更高版本的代码示例:
Private _isPowerUser As Boolean?
Private lazyLock As New Object
Public Function IsPowerUser() As Boolean
If Not _isPowerUser.HasValue Then
SyncLock lazyLock
If Not _isPowerUser.HasValue Then
_isPowerUser = GetIsPowerUser()
End If
End SyncLock
End If
Return _isPowerUser.Value
End Function
Private Function GetIsPowerUser() As Boolean
' Retrieve the information from the database and return
Return True Or False
End Function
编辑(2/2)
我将我的代码示例更改为在多用户环境中工作:
Private _powerUsers As New Dictionary(Of Long, Boolean)
Private ReadOnly LazyLock As New Object
Public Function IsPowerUser(userId As Long) As Boolean
If Not _powerUsers.ContainsKey(userId) Then
SyncLock LazyLock
If Not _powerUsers.ContainsKey(userId) Then
_powerUsers.Add(userId, GetIsPowerUser(userId))
End If
End SyncLock
End If
Return _powerUsers.Item(userId)
End Function
Private Function GetIsPowerUser(UId As Long) As Boolean
' Retrieve the information from the database and return
Return True Or False
End Function
用法示例:
Dim Steven As Long = 454151
If IsPowerUser(Steven) Then
Console.WriteLine("Steven is a power user.")
Else
Console.WriteLine("Steven is a normal user.")
End If