.net提供数千个类。类创建的对象就是引用类型。
1、Object类
Object是.net中每个类型的基类(包括值类型和引用类型),本质上,每个变量都是一个对象,都可作对象处理。
故,任意变量可转换为Object:引用类型-维护引用及实现代码,但会作一般类型处理;值类型-会从栈上提取,放于Object相关内存处。
自定义类创建的ToString()方法,在实例被强制转换成Objec类型时,也会调用定制的ToString方法
例:定义对象
Dim a As Object
a = Me
CType(a, Form).Text = "本窗体的标题显示在这里" 'Form作类型
2、String类
基本类型中唯一的引用类型,带有很共享处理方法,在一个字串变量后加点后会引出很多方法
(1)String()方法
String类的构造函数有多个。String()是默认的构造函数。
下面都是构造字串的方法:
Dim a As String = "ABC"
Dim b = "ABC"
Dim c As String = New String("A"c, 23) '重复23次字符A
Dim d = New String("+"c, 33)
Stirng类的共享方法多个,如:
Empty 属性,空串,用于比较或初始化;
Compare 比较两字串
CompareOrdinal 比较两字串(不考虑本国语言或文化)
Concat 字串连接
Copy 利用实例创建新的字串(复制)
Equals 判断两字串是否相同
IsNullorEmpty 高效地判断字串是空串还是Nothing
(2)SubString方法
SubString是对一个字串提取出子串的方法。有两个方式,如:
Dim a As String = New String("Hello World")
TextBox1.Text = a.Substring(0, 5) '字串首开始,长度5,即Hello
TextBox1.Text = a.Substring(6) '位置6开始(W),至末尾的字串
(3)PadLeft、PadRight
左、右对齐字串。即在哪边以什么字符进行填充,达到左右对齐的效果,如:
(4)String.Split方法
字串被字符字符(组)分隔成一个子字串数组。如:
a.Split("a"c,"b"c) '以分隔符a,b分隔
a.split(d) '以数组d数组来分隔。
故分隔符可是单个也可是多个
(5)String类的不可变
String类被定义为不可变的类,若对字符串进行改变或复制时,系统将分配新的内存空间来存储(原空间被回收机制回收)。
因为每一次变动字串,就意味着它会重新分配内存空间进行放置,如惊弓之鸟一样随时换巢,分配空间意味着花费更多时间。
例:下面每追加一个字串,就分配一下,所以时间长
为了克服这个毛病,可以用.net库中的System.Text.StringBuilder类,它类似一个先分配一个较的内存,尽管当前字串并
没有占满它,为后加编辑字串提供容纳空间,只有当无法容纳时,再次较大地扩大这个内存。这个就大大减轻了每一次都
要分配的负担。
例:可以看到StringBuider所花时间很少
(6)字串常量
Microsoft.VisualBasic.Contants类提供了一些常量。比如Contants.vbCrLf,以方便处理常用的一些常量字串
3、XML字面量
正如与Http源代码一样,除了带节点<>的显示字串,还显示“包括在内部”的字串。
另外还有嵌入一些变量字串,以显示变量的字串值如:<%=myString %>
4、DBNULL类与IsDBNULL()函数
数据库中有数据类型,但为NULL,为了适应这个,定制这个来判断其值
5、参数传递
参数的传递除了值传递、引用传递特性外,还有其它的特性。
(1)默认参数。
private function add2(byval a as int32,optional byval b as char="d"c)
加optional表示默认参数,可选,可以省略(其值为默认值)。
默认参数只能在参数列表最后
(2)ParamArray 参数数组
参数数组。一个参数只能传递一个值,为了传递多个值而不至于写多个参数,于是用ParamArray来指明传递的是一个数组(多个参数)
而且ParamArray还有一个妙用,尽管传递的不是一个数组,函数会根据传参把多个参数“当作一个数组”。
ParamArray只能在参数列表的最后一个参数。
注意下面与optional的位置
optional byval
byval paramArray
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim a As Int32() = {1, 2, 3, 4, 5}
TextBox1.Text = add2(a)
End Sub
Private Function add2(ByVal ParamArray c() As Int32) As Int32
Dim i As Int32
Dim temp As Int32 = 0
For Each i In c
temp += i
Next
Return temp
End Function
上面可以用add2(5,7,9,10),函数自动把这几个数组当作一个数组来看待,而不一定非得用数组变量(上例a)
这就是为什么ParamArray参数只能为最后一个参数的原因(不这样的话,容易把其它参数也作用了数组参数中的一员)
ParamArray不能与Optional一起使用。
同样,ParamArray不能与ByRef一起使用。但它可以与ByVal一起使用。如上例。
最好是ParamArray的前面不加修饰,这样好记忆
6、变量的作用域
.net的作用域有4种,作用域定义了每一个变量的生存期和优先级。
当变量不再处于作用域时,垃圾回收器就可以回收它了。
原则:小的作用域比较大的作用域更具优先级,即两作用域重叠时,先用较小的作用域。
(1)全局作用域 : 存在于整个程序运行期间,优先级最低。
(2)类级或模块级作用域:存在于类或模块生存期间,当类被删除时,变量也就不存在了。
当与全局作用域重叠时,全局作用域变量暂时“不可见”,类级变量作用域生效。
(3)方法作用域: 即sub,function等作用域(如里面的参数。)
(4)块级作用域:在某个程序语句块中声明的。比如在if...then或For each的语句块中声明的循环变量,出了循环块就失效。
Dim i As Int32 '全局作用域
Public Class Form1
Dim i As Int32 '类作用域
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim a As Int32() = {1, 2, 3, 4, 5}
TextBox1.Text = add2(a)
End Sub
Private Function add2(ByVal ParamArray c() As Int32) As Int32 '参数,方法作用域
Dim temp As Int32 = 0
For Each i As Int32 In c 'i是块作用域
temp += i
Next
Return temp
End Function
End Class