Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Visual Basic:如何生成自定义类的全局列表?_Vb.net_Class_Object_Global - Fatal编程技术网

Vb.net Visual Basic:如何生成自定义类的全局列表?

Vb.net Visual Basic:如何生成自定义类的全局列表?,vb.net,class,object,global,Vb.net,Class,Object,Global,我想我缺少了Visual Basic的一个重要特性。我主要是只知道C++,所以我不理解需要模糊关键字,以及作为新关键字。但是,我熟悉C++中的新键盘,它在使用指针时使用。 那么在VisualBasic中,所有变量都是指针吗?这是怎么回事 我想创建一个自定义类。并且有一个列表或数组,比如说其中的四个,并且在我的整个程序中都可以全局访问它们。我要在我的表单类中声明它们吗?我的程序只是一种形式 好的,我已经得到了这个列表,但是只在按钮点击子例程中。 如何将我的时钟列表设置为全球时钟 Publi

我想我缺少了Visual Basic的一个重要特性。我主要是只知道C++,所以我不理解需要模糊关键字,以及作为新关键字。但是,我熟悉C++中的新键盘,它在使用指针时使用。 那么在VisualBasic中,所有变量都是指针吗?这是怎么回事

我想创建一个自定义类。并且有一个列表或数组,比如说其中的四个,并且在我的整个程序中都可以全局访问它们。我要在我的表单类中声明它们吗?我的程序只是一种形式

好的,我已经得到了这个列表,但是只在按钮点击子例程中。 如何将我的时钟列表设置为全球时钟

    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

但是,应注意上述两个代码片段中的一个非常显著的差异:

在第二个示例中,我们使用“new”声明,因此创建了对象(类)的新实例

通常,我们希望控制类的实例(以及类的新(初始化)事件)何时运行(因此不要在var定义中使用new)

另一个问题是,如果省略NEW关键字,那么class变量本质上是指向该类的指针,但它还不存在

例如:

    Dim pbar1 As New Pbar

    Dim pbar2 As Pbar

    pbar2 = pbar1
因此,pbar2我们从未创建过该类的实例,所以它实际上是一个指针。因此,从下面的任何代码中,我可以使用pbar1或pbar2–它们指向并且是我们用“new”创建的一个类的同一实例

这个概念很重要,因为假设您要将一个类传递给另一个表单,那么您可以/将不带new关键字的类声明为该表单的全局作用域

请注意,如果希望其他表单/代码使用该变量,则应将该变量声明为“public”

例如:

如果全球公开,我们将使用:

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
因此,声明为“public”将为您提供全局范围,但您仍然必须使用变量所在的形式限定var

但是,范围仍然限于必须打开的表单。如果该表单已关闭或超出范围,则您当然不能在其他表单/代码中引用该表单

多少“多”形式,需要真正的全局范围变量? 有很多方法,但最简单的是向项目中添加一个标准代码模块。因此,添加一个“模块”而不是“类”。在该标准代码模块中,您可以为整个应用程序放置您想要的公共例程(函数/子函数)。因此,这种方法很好,因为您不必创建该代码模块的实例(它不考虑类)。它只是一个标准的“库”代码,你可以在一组例程中推它。这是VB6或VBA的遗留思想和概念,但它确实很好。

在这些模块中声明的任何公共var都是应用程序范围的全局变量

(如果使用“dim”,则范围仅限于该模块)

因此,如果我们添加一个代码模块,我们会得到:

Module Module1

    Public GlobalPbar As New Pbar

    Public Sub Test()

        MsgBox("test")

    End Sub

End Module
所以我用了“public”来代替“dim”,因为我想在“module1”之外使用这个var

那么对于全局作用域函数、子函数和变量(包括指向类变量的指针)

只需在项目中创建(添加)一个标准代码模块。有些人甚至经常创建/添加一个名为MyGlobals的代码模块,他们甚至不放置任何子/函数,而只是一个“公共”变量列表,当然,这些变量的作用域将限定于整个应用程序

总而言之: 声明一个不带“new”的类变量将创建一个指向给定类实例的指针。(在本例中,指针为nothing—对象还不存在)

您可以将一个类的现有实例分配给上述声明的变量–它的工作方式类似于指针。您必须在代码中使用new关键字来创建该实例

为了方便起见,您还可以使用“new”关键字将上述两个步骤合并为一个declare。这通常是这样做的,当然,对于“重载”,我们可以在执行此操作时提供参数


您可以在标准代码模块中创建全局变量。您还可以创建“列表”该代码模块中的变量,并且它也将是全局范围的,而不是绑定到一个表单,并且您不必绑定或限制到正在打开的表单的任何实例来使用此类全局变量。并且您不必使用module1限定子变量或变量,它们是全局范围的。

注释和解释是一致的

公共类表单2
私有时钟列表作为新列表(MyClock)“这可以在表单代码的任何地方看到。
私有子按钮2\u单击(发送者作为对象,e作为事件参数)处理按钮2。单击
'在设置属性和不设置属性的情况下将项目添加到列表中
添加(新的MyClock(新的TimeSpan(1,13,22,7),True))
时钟列表。添加(新的MyClock)
添加(新的MyClock(新的时间跨度(0,11,3,6),False))
添加(新的MyClock(新的TimeSpan(3,7,11433),True))
Debug.Print(ClockList.Count.ToString)
控制台写入线(时钟列表(0))
'将打印列表中第二项的默认属性
控制台写入线(时钟列表(1))
控制台写入线(时钟列表(2))
控制台写入线(时钟列表(3))
Console.WriteLine(“属性设置后列表中第二项的值”)
'设置列表中第二项的属性
时钟列表(1)。活动=错误
时钟列表(1).elapsedtime=新的时间跨度(14,7,22,34)
控制台写入线(时钟列表(1))
端接头
末级
公共类MyClock
'时间跨度(天、小时、分钟、秒、毫秒)
'不需要为TimeSpan或call New设置默认值
'时间跨度是由Int组成的结构
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
Module Module1

    Public GlobalPbar As New Pbar

    Public Sub Test()

        MsgBox("test")

    End Sub

End Module