探秘VB.net中的shared与static

简单了解了一下C#之后,很快就要开始重构机房收费系统了,有人选择用C#来实现,不过还是想好好了解一些VB.net,用它来实现。

有了VB和面向对象基础,学习VB.NET是极易上手的。学习了几种语言的我们都有一种体会,编程语言就是一门语言,一个工具,通过它来实现某些功能。假如我们之前学过C++,C#等任何一门OO语言,通过这些语言了解了OOP,现在让你来学习VB.NET,肯定会特别容易,虽然他们的语法不一样,但其中的思想都是一样的,都有类、构造函数、属性……

VB.net和C#一些关键字的比较:

C#关键字 VB.net关键字
using Imports
 this Me
 void sub
 base MyBase
abstract Mustlnherit
sealed NotOverrideable
virtual MustOverride
switch Select
internal Friend
static shared
…… ……

不过大家有木有发现,在VB.net中也有static的踪影,那么在VB.net中,static是不是和C#中的static一样呢?它和shared有何区别呢?

前面写过一篇关于static的博客,这里相当于再小拓展一下。

先看两个小例子:

C#:

    public class CircleArea    //计算圆的面积
    {
        public double Area(double radius)     //根据传入的半径值计算圆的面积
        {
            return PI.PI * radius * radius;
        }
    }

    public class PI     //定义PI的值
    {
        public static double PI = 3.14;      '在这里,用static来修饰PI,以便其他地方调用
    }

VB.net:

    Public Class CircleArea   '计算圆的面积
        Public Function Area(ByVal radius As Double) As Double  '根据传入半径来计算圆的面积
            Return PI.PI * radius * radius
        End Function
    End Class

    Public Class PI     '定义PI的值
        Public Shared PI As Double = 3.14       '
    End Class

上面两个小例子中,都是把PI定义为静态的值,然后供需要使用PI的类或其他地方来调使用,而且此时在VB.net实现的例子中,PI类中的Shared无法换成Static,否则就会出现下面的错误提示:

原因何在?

先来说VB.net中的Static

还是通过一个例子来说明,建立一个VB.net窗体应用程序:

    Public Class frmTest
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Static Dim temp As Integer = 1   '定义一个static变量temp
            temp = temp + temp
            MessageBox.Show("temp=" & temp)
        End Sub
    End Class

当程序运行起来时,点击Button1,弹出 temp=2;再点击,temp=3,再点击,temp=4……  并且,在这里如果把Static换为Shared,则会报错:

因此可以判断,在VB.net中的static主要用来修饰的是静态变量,这里强调“静态”,主要是用static修饰的变量在程序运行时,在它的生存期内都是一直存在并保留着最新值,在下次调用时,不会被重新初始化。

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

再来说VB.net中的shared

在编程的过程中,经常需要共享一些数据,如我们在开发机房收费系统中用到的“单价”,与数据库连接的字符串等等,都需要共享。

回头来看文章开头那个计算圆面积的VB.net小程序:

    Public Class CircleArea   '计算圆的面积
        Public Function Area(ByVal radius As Double) As Double  '根据传入半径来计算圆的面积
            Return PI.PI * radius * radius
        End Function
    End Class

    Public Class PI     '定义PI的值
        Public Shared PI As Double = 3.14       '
    End Class

这里,为什么叫“Shared”?share在英语中是“分享、共用”的意思,而这里的Shared所修饰的对象同样存放“同一个值”,是就用来“分享”的,供其他需要的对象所调用,因此我更喜欢称它“共享类型”。跟上面的PI一样,任何大小的圆计算面积时都要使用PI值,所以把它用Shared来修饰。

什么时候用Shared?

上面说到:“只能对局部变量使用static。Static变量的声明上下文必须是一个过程中的块,而不是源文件、命名空间、类、结构或模块,不能再结构过程内使用Static。”,Shared刚好相反,它不能修饰局部变量,

如果一个变量需要其他程序段共用时,那么就用Shared,Shared可以用在Event 、Function 、Property 、Sub  等语句中。

更多精彩内容可参考MSDN:Shared
(Visual Basic)
  &&  Shared
(Visual Basic)

菜鸟学艺不精,仅供参考,如有出入,欢迎交流。

探秘VB.net中的shared与static,布布扣,bubuko.com

时间: 2024-08-27 06:55:31

探秘VB.net中的shared与static的相关文章

VB.NET中的除法运算符 与 C#中的除法运算符

VB.NET中的除法运算符有两个:/(浮点除法).\(整数除法) C#中的除法运算符只有一个:/(除法) VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分. 关于VB.NET中的除法运算符的介绍(摘自MSDN): /(浮点除法):将两个数相除并返回以浮点数表示的结果. 所得结果的数据类型取决于操作数的类型. 下表显示如何确定结果的数据类型. 操作数数据类型 结果数据类型 两个表达式都是整数数据类型(SByte.Byte.Short.UShort.Integer.UIn

[转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBox.Show (IWin32Window, String) 在指定对象的前面显示具有指定文本的消息框. MessageBox.Show (String, String) 显示具有指定文本和标题的消息框.由 .NET Compact Framework 支持. MessageBox.Show (IWi

关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调用编写好的DLL进行计算的. 目标 使用c++把类封装到dll,并在vb.net中调用该dll,使用该dll中封装好的类.在查找资料的过程中,发现vb.net调用dll的方法主要有两种. (IDE:Visual Studio 2013 professional) 方法一:使用Declare语句 vb

vb.net中,如何把byte array还原成为包含中文的字符串

这个问题,在网上好找了半天,但说实在话,不得不说,现在的程序员,脑子都僵化了. 一个能解决的也没有. 这还不说,多数人指出应当两边都用UNICODE,不要用ASC 2码之类的.我想说,这些是人家问的吗?不懂就是不懂,要是我就这样,何必不懂还要瞎JB指挥? 但我要说,这正是知其然不知其所以然,正确的回答,永远是先解释完提出问题的人,然后解决之. 然后,如果你愿意画蛇添足,再加上自己的想法.不想多说了,正确的代码我放在这里: '====================================

c#.net与vb.net中读写Cookie的方法!

Cookie (HttpCookie的实例)提供了一种在 Web 应用程序中存储用户特定信息的方法.例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息. C#.net部分 创建Cookie方法 (1)Response.Cookies["userName"].Value = “admin";Response.Cookies[“userName”].Expires = DateTime.No

VB6中的引用传递 与 VB.NET中的引用传递的区别

首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Private Sub CommandButton1_Click() ChangeName CommandButton1.caption End Sub Private Sub ChangeName(caption As String) caption = "NameHasBeenChanged!&quo

C++中关键字的理解--Static

C++中关键字的理解---Static 目录:1.static缘起             2.static自我理解             3.static举例使用             4.总结 -------------------------------------------------------------------------------------------------- 1.static缘起         C语言是面向过程构架,多文件为单位的编码的优异之处在于保持不同

VB.NET中自定义GridView的多行复合表头

我们都知道单行表头的合并是很好实现的,只需室友横跨列的ColumnSpan属性就可以实现, 但是在开发中,经常遇到表格的多行复合表头设计的问题,怎么扩展GridView控件以实现多行表头呢? ­要点:先定义第一行各占多少行,多少列,再追加第二行,以此类推 主体思路是这样的,GridView在ASP.NET中最终是转化为html的表格格式来显示的,所以我们要在其中做点文章, 看下面这段代码: 1 ''' <summary> 2 ''' 画面レイアウトより.GridViewのヘッダを設定 3 ''

php类中的$this,static,const,self这几个关键字使用方法

本篇文章主要分享一下关于php类中的$this,static,final,const,self这几个关键字使用方法 $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如:$this->属性,$this->方法 <?php /** * 有关人类 */ class Person { private $name='张三'; public $sex; public funct