• VB.NET Shared(共享)和 Static(静态)关键字的区别


    共享成员(Shared):

    VB.NET现在是支持真正的面向对象编程,可以继承、使用多态、共享成员 和静态成员。

    共享成员就是在所有类和所定义派生类的实例之间共享的方法、属 性、字段和事件。所有使用类创建的对象都可以访问相同的数据、共享实现过程 ,并且收到相同的激发事件。

    要实现函数过程的共享性,只需在 Public 或 Private 成员修饰符后加上 Shared 关键字即可了。

    Shared 关键字指示一 个或多个被声明的编程元素将被共享。

    共享元素不关联于某类或结构的特定实例 。可以通过使用类名或结构名称或者类或结构的特定实例的变量名称,限定共享元素来访问它们。

    简单的描述就是Shared变量是为类型本身服务而不是为特定对象服务的。

    你来看这段代码

    Module Module1
        Private Class First
            Public Shared a As String = "Hello World" '共享性变量
            Public b As Integer = 100 '非共享性的公开变量
            Public Shared Function strInfor() As String
                Dim a As String = Nothing
                For i = 0 To 10
                    a &= " " & i * 2
                Next
                strInfor = a
            End Function
        End Class
        Sub Main()
            '在不没实例化类对象时,可以直接使用该类的共享成员,但在使用时,必须指定共享成员所在的类名或结构名
            Dim strText As String = First.a
    
            '下面这句引用就是错误的,因为对非共享成员的引用,需要先实例化对象,再通过对象名来引用
            Console.WriteLine("First 类中共享性变量 a 的值为:{0}", strText)
            Console.WriteLine("First 类中共享性函数 strInfor 的值为:{0}", First.strInfor)
            Console.Read()
        End Sub
    End Module

    如图:

    结果:

    注意:有两个要点,一个是共享成员如果是方法或属性,我 们不用创建实例就可以直接用‘类名.共享成员’的方法进行调用;第 二个要点,共享字段是唯一的,也就是所以的调用程序都是访问的同一个变量,所以,它的值可以被任何调用对象所修改。

    静态成员(Static ):

    Static 关键字指定在声明一个或多个局部变量的过程终止后,这些已声明的局部变量继续存在并保留其最新值。

    通常,过程终止后,此过程中的局部变量将立即消失。静态变量可继续存在,并保留其最新值。您的代码下次调用此过程时,此变量将不会重新初始化,仍然存储已赋给它的最新值。静态变量在定义它的类或模块的生存期内继续存在。

    规则

    • 声明上下文。 只能对局部变量使用 Static这意味着 Static 变量的声明上下文必须是一个过程或过程中的块,而不能是源文件、命名空间、类、结构或模块。

      不能在结构过程内使用 Static

    • 组合修饰符。 不能在同一声明中将 StaticReadOnlyShadowsShared 同时指定。

    行为

    任何局部变量的行为都取决于此变量是否在 Shared 过程中声明。如果过程为 Shared,该过程的所有局部变量都自动共享,包括 Static 变量。整个应用程序只有一个这种变量的副本。使用类名调用 Shared 过程,而不是使用指向此类的实例的变量。

    如果过程不是 Shared,则其局部变量为“实例变量”,包括 Static 变量。每个变量在类的每个实例中都有一个独立的副本。使用指向类的特定实例的变量调用非共享过程。该实例中的任何变量都与另一实例中相同名称的变量无关。因此,它们可以存储不同的值。

    看实例:

    Module Module1
        Private Class First
            Public Function intValue() As Integer
                Static a As Integer
                a = a + 1
                Return a
            End Function
        End Class
        Sub Main()
            Dim intA As New First
            Console.WriteLine("First 类中 intValue的值为:{0}", intA.intValue)
            Console.WriteLine("First 类中 intValue的值为:{0}", intA.intValue)
            Console.WriteLine("First 类中 intValue的值为:{0}", intA.intValue)
            Console.WriteLine("First 类中 intValue的值为:{0}", intA.intValue)
            Console.WriteLine("First 类中 intValue的值为:{0}", intA.intValue)
            Console.WriteLine("First 类中 intValue的值为:{0}", intA.intValue)
            Console.Read()
        End Sub
    End Module

    我们来看结果:

    很好的证明了,当每次的函数过程调用结束后,它里面的静态变量的值并没被 CLR 的垃圾回收机制清空并释放。这里共调用了六次,而每次最新的值都被保留了下来,直到程序被关闭,才会被清空和释放。

  • 相关阅读:
    用DllImport引用的外部DLL文件如何通过clickonce发布
    关于Response.Redirect 端口不一致的跳转
    c# 使用递归 循环遍历导航树结构 并解析
    .net判断用户使用的是移动设备还是PC
    Lucene.net 从创建索引到搜索的代码范例
    C#敏感关键词过滤代码
    对SQL Server SQL语句进行优化的10个原则
    SQL Server表分区
    asp.net 真正实现完全跨域单点登录
    ASP.NET性能优化小结
  • 原文地址:https://www.cnblogs.com/lfls128/p/4945652.html
Copyright © 2020-2023  润新知