背景:
在敲机房收费系统修改密码过程中,遇到一个问题:如何将登陆的用户名记录下来,以供修改密码查找记录时调用。
曾经敲vb版本机房时,是在模板里定义了一个公共变量,这里应该也是这种思想....但如何定义呢?
先说下解决方法吧:
用share关键字:
在实体中:
- Public Shared UserID As String
这样就可实现将变量值应用于整个程序。
调用时便不用初始化,直接:项目.类.变量名即可调用。
最初想到这个问题(如何设定一个公共变量),我先想到了:如何让一个变量被赋值,调用时不再变化(实例化后不是空)。然后我首先想到的是static关键字,static关键字是在C++考试时接触较多的。但我也只知道给static类变量赋值后,将保留最新值,其它也不是很了解。试验后,结果是:static用在这里是不合适的,所以又找到了share。
static为什么不行,问题在哪,它和share有什么区别?
基于这些问题,总结了这篇博客:
static:
指定在声明一个或多个局部变量的过程终止后,这些已声明的局部变量继续存在并保留其最新值。
通常,过程终止后,此过程中的局部变量将立即消失。静态变量可继续存在,并保留其最新值。您的代码下次调用此过程时,此变量将不会重新初始化,仍然存储已赋给它的最新值。静态变量在定义它的类或模块的生存期内继续存在。
但只能对局部变量使用Static。这意味着 Static 变量的声明上下文必须是一个过程或过程中的块,而不能是源文件、命名空间、类、结构或模块。
不能在结构过程内使用 Static。
在机房收费系统修改密码时,是利用登录时的用户名搜索相应记录查找信息。登录和修改密码是不同的类,所以用static不合适,登录时,将用户名记录在static类变量中,当登录界面关闭时,变量即消失,下次使用需再次初始化,所以无法在不同类间共享用户名信息。
share:
指定一个或多个声明的编程元素与一个类或结构在整体上相关联,而不是与类或结构的特定实例关联。
share是一个共享成员。共享成员即被类的实例所共享的属性、过程、字段等。
总言之:share与static最大的区别在于:share的作用域为整个程序,而static只面向一个类。
举例比较:
static:
Public Class Describer
Public Function NextNumber() As Integer
static Number As Integer
Number += 1
Return Number
End Function
End Class
Dim Desc1 As New Count
Dim Desc2 As New Count
MsgBox(Desc1.NextNumber) '输出1
MsgBox(Desc1.NextNumber) '2
MsgBox(Desc1.NextNumber) '3
MsgBox(Desc2.NextNumber) '1
MsgBox(Desc2.NextNumber) '2
MsgBox(Desc2.NextNumber) '3
share:
Public ClassCount
Share Number As Integer
Number += 1
Return Number
End Function
End Class
Dim Desc1 As New Count
Dim Desc2 As New Count
MsgBox(Desc1.NextNumber) '输出1
MsgBox(Desc1.NextNumber) '2
MsgBox(Desc1.NextNumber) '3
MsgBox(Desc2.NextNumber) '4
MsgBox(Desc2.NextNumber) '5
MsgBox(Desc2.NextNumber) '6
对比可以看出:static跟随类的关闭而清空。share一直保存最新数据。
总结:
遇到问题,先自己思考,寻找解决方法。再在方法中对比学习,将收获多多。