我是 vb.net 的新手,我正在尝试优化我正在处理的代码执行。我正在开发一个有超过 45 种表格的程序。在每种形式中,它调用函数 IsPowerUser 来检查是超级用户
如果我们可以在登录时存储有关用户的所有详细信息,那么我们需要在每次需要时使用这些值,而不是从数据库中收集数据。可能这个问题属于VB基础。
我是 vb.net 的新手,我正在尝试优化我正在处理的代码执行。我正在开发一个有超过 45 种表格的程序。在每种形式中,它调用函数 IsPowerUser 来检查是超级用户
如果我们可以在登录时存储有关用户的所有详细信息,那么我们需要在每次需要时使用这些值,而不是从数据库中收集数据。可能这个问题属于VB基础。
您可以使用延迟初始化来推迟数据库调用,直到您真正需要信息(如果有的话),然后存储该值以供重用。
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)
Lazy(Of T)
直到 .NET 4 才引入,所以这里有一个适用于 .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