簡體   English   中英

Visual Basic:如何創建自定義類的全局列表?

[英]Visual Basic: How do I make a Global List of a custom Class?

我認為我缺少Visual Basic的重要特性。 我大多只了解C ++,所以我不了解Dim關鍵字和As New關鍵字的必要性。 但是,我熟悉C ++中的“新建”鍵盤,當您使用指針時會使用它。

因此,在Visual Basic中,所有變量指針都是嗎? 這里發生了什么?

我想做一個自定義的類。 並列出其中的四個列表或一個數組,以使它們在我的整個程序中都可以全球訪問。 我可以在Form類中聲明它們嗎? 我的程序只是一種形式。

好的,所以列表已經存在,但是僅在按鈕中單擊了子例程。 如何使我的時鍾列表全局化?

    Public Class MyClock
        Public elapsedtime As New TimeSpan(0, 0, 0, 0, 0)
        Public active As Boolean
        Public Sub New()
            elapsedtime = New TimeSpan(0, 0, 0, 0, 0)
        End Sub
        Public Function Display()
            Return elapsedtime.ToString
        End Function


        Public Sub Start()
            active = True
        End Sub
        Public Sub Stopclock()
            active = False
        End Sub
        Public Sub Toggle()
            If (active = True) Then
                active = False
                Stopclock()
            Else
                active = True
                Start()
            End If
        End Sub

    End Class

    Public Class Form1
        Dim ticincrement As New TimeSpan(0, 0, 0, 0, 100)

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        End Sub

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim ClockList As New List(Of MyClock)()
            ClockList.Add(New MyClock)
            ClockList.Add(New MyClock)
            ClockList.Add(New MyClock)
            ClockList.Add(New MyClock)


            Console.WriteLine(ClockList.Count)
            Console.WriteLine(ClockList(0).elapsedtime)
        End Sub

    End Class

好的,“ new”關鍵字只是允許您聲明變量(它是一個指針)並創建+初始化分配給該變量的類的實例的捷徑。

以下兩個相同。

Dim TestClock   as MyClock

TestClock = New MyClock

Dim TestClock   as New MyClock.

但是,應注意以上兩個代碼片段的一個非常重要的區別:

在我們使用“ new”聲明的第二個示例中,因此創建了對象(類)的新實例。

通常,我們想控制類的實例的運行時間(類的新(初始化)事件將運行)(因此,請勿在var define中使用new)。

另一個問題是,當您省略NEW關鍵字時,class變量實際上是指向該類的指針,但是尚不存在。

例如:

    Dim pbar1 As New Pbar

    Dim pbar2 As Pbar

    pbar2 = pbar1

因此,pbar2我們從不創建該類的實例,因此它實際上是一個指針。 因此,從下面的任何代碼中,我都可以使用pbar1或pbar​​2-它們指向的對象與我們用“ new”創建的一個類的實例相同。

這個概念很重要,因為說如果您要將一個類傳遞給另一種形式,那么您可以/將聲明沒有新關鍵字的類作為該類的全局作用域。

請注意,如果您希望其他表單/代碼使用該變量,則應將變量聲明為“ public”。

例如:

Imports System.Threading

Public Class Form1

    Dim MyPbar As Pbar


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Etc. etc.

如果是全球公開的,我們將使用:

Imports System.Threading

Public Class Form1

    Public MyPbar As Pbar   <--- pubic scope - can use outside of form


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

等等

現在

然后在項目中的“任何”其他地方,您可以執行以下操作:

    Form1.MyPbar.Min = 1

    Form1.MyPbar.Max = 10

因此,聲明為“ public”將使您具有全球范圍。 但是您仍然必須通過變量所駐留的形式對var進行限定。

但是,范圍仍然限於必須開放的形式。 如果該表單已關閉或超出范圍,那么您當然不能在其他表單/代碼中引用該表單。

多少數量的“許多”形式,並且想要真正的全局范圍變量?

存在許多方法,但是最簡單的方法是將標准代碼模塊添加到項目中。 因此,添加一個“模塊”而不是一個“類”。 在該標准代碼模塊中,您可以放置​​整個應用程序所需的通用例程(函數/子例程)。 所以這種方法很好,因為您不必創建該代碼模塊的實例(不考慮類)。 它只是標准的代碼“庫”,您可以在其中匯編一堆例程。 這是VB6或VBA的繼承思想和概念,但確實不錯。

並且在此類模塊中聲明的任何公共變量都在整個應用程序范圍內是全局的。

(如果使用“ dim”,則作用域僅適用於該模塊)。

因此,如果我們添加代碼模塊,則會得到以下信息:

Module Module1

    Public GlobalPbar As New Pbar

    Public Sub Test()

        MsgBox("test")

    End Sub

End Module

因此,我要使用“ public”代替“ dim”,因為我想在“ module1”之外使用此var。

那么對於全局范圍函數,子函數和變量(包括指向類vars的指針)?

只需在項目中創建(添加)標准代碼模塊即可。 有些人甚至經常創建/添加一個稱為MyGlobals的代碼模塊,它們甚至不放置任何子功能,而只是放置一系列“公共”變量,這些變量當然會作用於整個應用程序。

因此,總而言之:聲明不帶“ new”的類var會創建一個指向給定類實例的指針。 (在這種情況下,指針為空-該對象尚不存在)

您可以將一個類的現有實例分配給上面聲明的變量–它的工作原理類似於指針。 您必須在代碼中使用new關鍵字來創建該實例。

為了方便起見,您也可以將上述兩個步驟組合為一個帶有“ new”關鍵字的聲明。 這通常是可以做到的,當然,通過“重載”,我們可以在您執行此操作時提供參數。

您可以在標准代碼模塊中創建全局變量。 您也可以在該代碼模塊中創建“列表”變量,並且該變量也將再次在全局范圍內,而不是與一個表單綁定,並且您也不受任何形式的實例打開或綁定到此類全局變量。 而且您不必使用module1來限定子變量或變量,它們是全局范圍的。

評論和解釋是在線的。

Public Class Form2

    Private ClockList As New List(Of MyClock) 'This can be seen anywhere in the Form code.

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'Add items to list with and without setting properties
        ClockList.Add(New MyClock(New TimeSpan(1, 13, 22, 7), True))
        ClockList.Add(New MyClock)
        ClockList.Add(New MyClock(New TimeSpan(0, 11, 3, 6), False))
        ClockList.Add(New MyClock(New TimeSpan(3, 7, 11, 433), True))
        Debug.Print(ClockList.Count.ToString)
        Console.WriteLine(ClockList(0))
        'The default properties will print for the second item in the list
        Console.WriteLine(ClockList(1))
        Console.WriteLine(ClockList(2))
        Console.WriteLine(ClockList(3))
        Console.WriteLine("Values for the second item in list after properties set")
        'Setting properties of the second item in list
        ClockList(1).active = False
        ClockList(1).elapsedtime = New TimeSpan(14, 7, 22, 34)
        Console.WriteLine(ClockList(1))
    End Sub

End Class

Public Class MyClock

    'TimeSpan(days,hours,minutes,seconds,milliseconds)
    'There is no need to set default values for the TimeSpan or call New
    'The TimeSpan is a Structure made up of Integers so the default values 
    'are automatically set
    Public Property elapsedtime As TimeSpan
    Public Property active As Boolean

    Public Sub New() 'Add back the default constructor
        'unnecessary to assign elapsedTime because it is already set to (0,0,0,0,0)
    End Sub

    Public Sub New(ETime As TimeSpan, act As Boolean)
        elapsedtime = ETime
        active = act
    End Sub
    Public Function Display() As String
        Return elapsedtime.ToString
    End Function

    'Public Sub Start()
    '    active = True
    'End Sub
    'Public Sub Stopclock()
    '    active = False
    'End Sub
    Public Sub Toggle()
        active = Not active
        'If active = True Then
        '    active = False
        'You just set active to False, why would you call a Sub to set it to False?
        'Stopclock()
        'Else
        'active = True
        'You just set active to True, why would you call a Sub to set it to True?
        'Start()
        'End If
    End Sub

    Public Overrides Function ToString() As String
        Return $"Elapsed Time is {elapsedtime.Days} Days, {elapsedtime.Hours} Hours, {elapsedtime.Minutes} Minutes, {elapsedtime.Seconds} Seconds, {elapsedtime.Milliseconds} Milliseconds and Active is {active}"
    End Function

End Class

結果顯示在立即窗口中

4

經過時間為1天13小時22分鍾7秒0毫秒,有效時間為True

經過的時間是0天,0小時,0分鍾,0秒,0毫秒,並且活動為False

經過的時間是0天,11小時,3分鍾,6秒,0毫秒,並且活動為False

經過時間為3天7小時18分鍾13秒0毫秒,有效時間為True

屬性設置后列表中第二項的值

經過的時間是14天7小時22分鍾34秒0毫秒,並且活動為False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM