0

我是 vb.net 的新手,我正在尝试优化我正在处理的代码执行。我正在开发一个有超过 45 种表格的程序。在每种形式中,它调用函数 IsPowerUser 来检查是超级用户

如果我们可以在登录时存储有关用户的所有详细信息,那么我们需要在每次需要时使用这些值,而不是从数据库中收集数据。可能这个问题属于VB基础。

4

1 回答 1

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)

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
于 2013-07-27T11:43:23.243 回答