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 与 ReadOnly、Shadows 或 Shared 同时指定。
行为
任何局部变量的行为都取决于此变量是否在 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 的垃圾回收机制清空并释放。这里共调用了六次,而每次最新的值都被保留了下来,直到程序被关闭,才会被清空和释放。
VB.NET Shared(共享)和 Static(静态)关键字的区别的更多相关文章
- Java中static静态关键字的使用
我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字 被静态关键字修饰的成员属于 ...
- php笔记(二)PHP类和对象之Static静态关键字
PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...
- static(静态)关键字
class Person{String name; //成员变量,实例变量(实例中的变量) //共享数据出现在对象之前static String country="cn"; //对 ...
- Java之static静态关键字详解|final关键字详解
前言 在Java语言中,static表示"静态"的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法 ...
- php中static静态关键字的使用
php中除了常规类和方法的使用,访问控制之外,还有静态关键字static,静态变量可以是局部变量也可以是全局变量,当一个程序段执行完毕时,静态变量并没有消失,它依然存在于内存中,下次在定义时还是以前的 ...
- php中static静态关键字的使用方法和应用场景
php中除了常规类和方法的使用,访问控制之外,还有静态关键字static,静态变量可以是局部变量也可以是全局变量,当一个程序段执行完毕时,静态变量并没有消失,它依然存在于内存中,下次在定义时还是以前的 ...
- static静态关键字
转载自大佬:https://www.cnblogs.com/xrq730/p/4820992.html 静态资源和静态方法 首先,静态的资源和方法等会随着类的加载而进入内存被初始化,而非静态的资源和方 ...
- Java static静态关键字 有啥用
#static有啥用 在Java语言中,static表示“静态”的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法. ...
- php中static 静态关键字
一直依赖对于php中static关键字比较模糊,只是在单例模式中用过几次.上网查了查,没有找到很全的介绍,自己总结一下. 根据使用位置分为两部分 1.函数体中的静态变量 2.类中的静态属性和方法 1 ...
- 14. static(静态) 关键字
1.修饰成员变量 1)定义:数据需要被共享给所有对象使用使用static修饰(全局变量) 2)注意: 1.用static中创建的成员变量在内存中只有一份 2.千万不要为了方便访问数据而使用static ...
随机推荐
- Struts2体系结构图以及详解
Strut2的体系结构如图所示: 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(F ...
- hdu3599 War(最大流)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud War Time Limit: 2000/1000 MS (Java/Others ...
- Python爬虫学习:四、headers和data的获取
之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.c ...
- 【转】Memcached管理与监控工具----MemAdmin
原文连接:http://blog.csdn.net/ajun_studio/article/details/6746877 原文作者:halfMe 转载注明以上信息! 使用MemCached以后,肯定 ...
- ASP.NET MVC 4.0 学习6-Model Binding
一,ViewData,ViewBag與TempData ASP.NET MVC架構中,通過繼承在Controller中的ViewData,ViewBag和TempData和View頁面進行資料的存取, ...
- information_schema.collation_character_set_applicability 学习
字符集和排序规则之间是不可以随便搭配的.如果你想知道一个字符集它所搭配的排序规则有哪些?那就可以从information_schema.collation_character_set_applicab ...
- Why Does Qt Use Moc for Signals and Slots(QT官方的解释:GUI可以是动态的)
GUIs are Dynamic C++ is a standarized, powerful and elaborate general-purpose language. It's the onl ...
- You don't seem to have 'make' or 'gmake' in your PATH
标题尚的错误,不是原因,因为which make的时候是有显示/usr/bin/make的,echo $PATH的时候也是有make的路径的. 编译Qt ./configure的时候出现标题上错误, ...
- 2015第10周四-CSS小结
这两天做前台页面发现个人在CSS前端方法很多基础知识都忘了,晚上又搜索学习了下,把相关内容摘录总结. CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector {declara ...
- [破解] DRM-内容数据版权加密保护技术学习(中):License预发放实现
在上一篇文章里实现了对媒体文体的DRM加密,现在一起来实现License的预发放. 所谓预发放就是在播放媒体文件之前先获取到License,License获取成功后,可直接在电脑上进行媒体文件的播放. ...