基本语法
-
Read()函数可充当暂停进行使用
-
要转换成什么类型就在前面加上C类型()即可
-
取模运算不是%而是Mod
-
不等于不是!=而是<>
-
在Unicode编码中小写字母比大写字母靠后 Asc(char ch)取ASC码
-
使用Is/Like与其他的字符串拼接进行输出,一定要用CStr将A IS/Like B转成字符串才能输出
-
&&-》And |-》 Or
-
不要认为Xor就是or相反的结果,严格按定义来,Xor判断左右两个表达式结果不同时,则为真
-
AndAlso 、 OrElse 是And和Or的进阶版,其目的一样
-
IIF(a>b,a,b) 三目运算符用函数的形式来使用,而并非表达式
-
switch -> Select Case [变量]
Case 变量值
End Select -
占位符输出Console.WriteLine(“{0} {1}”,a,b)
-
Chr(13)或vbNewLine都可以作为换行使用
-
MessageBox.Show(“对话框内容”,“标题”,对话框类型) // 第三个参数从对话框控件里进行挑选,为可省参数
字符串常见方法
-
对字符串转大写小写方法:LCase(String str) UCase(String str) 或者 Str.ToUpper()/Str.ToLower()
-
Mid(String str,Integer Start,Integer length) 截取字符串子串
-
**Str.IndexOf(char ch)**返回在字符串中第一个ch的下标(索引) 可用于字符串或者数组 SubString()截取出字符串中指定的子串 更多方法见p172
-
String.Format(“{0:[D|T|hⓂ️s|dddd,MMM d yyyy]}”,DateTime.Now) 其中数值格式指定字符即为冒号“:”后面的字符 如 “:p” 以百分号表示
-
字符串操作:以某个字符分割字符串:**Str.Spilt(“要分割的字符”) 删除空格:Trim()**见P195
循环
-
Do While …Loop 是满足条件就执行Staement,否则就Loop 而Do Until …Loop与之相反
-
Do While …Loop & Do … Loop While 同下
-
Do …Loop Until 与Do Until …Loop 只是执行顺序不同(先执行再判断/先判断再执行),其核心不变
-
Exit For/While/Do 注意在Do While/Do Unitl 中断是Exit Do
-
Continue 会跳过本次循环内以后的所有代码,直接进入下一次循环(Continue Do / Continue For)
数组
-
声明数组方式:一维:Dim Arr() As Integer = {1,2,3} 二维:Dim Arr(,) As Integer = {{1,2}{4,5}{6,0}}
如果Arr()括号里指定R [L] 则不用初始化数组每个元素的具体值 Dim Arr(2,2) As Integer <==>{{0,0},{0,0}} -
UBound(Arr,Integer)用于返回数组索引上界,通常用于统计数组长度:For i = 0 To UBound(Arr)
-
实现动态数组最直接暴力的方式就是,声明数组的时候,通过输入变量参数来直接控制数组的大小,而不是常量
如:Dim Arr(变量) As Integer -
ForEach类似于JavaScript、Python、Java里的for … in …用法: ForEach list in List
-
数组名就是首元素地址,这个依然成立在VB.net.
-
数组复制最好使用clone方法 Array2Array1.clone(),这样做不会把地址也复制过去,只是复制其内容。如果你想复制地址就直接赋值:Array2=Array1==
-
之所以对于数组的排序方法(冒泡、选择等)可以实现,是基于操作数组的时候以及声明或使用数组时候都是引用于同一个数组的地址
函数
-
Byval传递参数值 ByRef传递参数的引用地址(该参数指向的地址)但将数组作为参数进行传递时永远都是传递其地址
-
当声明一个返回值为数组的函数时,需要在最后面加上括号 如:Function 函数名() As Integer() <–
-
可选参数的语法 函数名(Optional Byval 参数名 As Integer = 0) “=0” 表示初始化该参数的值
-
参数数组ParamArray的用法: 函数名(ByVal ParamArray Str() As Integer) 其中Str()表示数组,可以用于传递n个数字的数组
-
在vb里,既可以按位传参,也可以按名传参。按位传参就是最常见的传参方式,按名传参:函数名(参数名1:=值1,参数名2:值2,参数名3:=值3)
其他
-
如何生成随机数?先使用Randomize()根据系统时间生成一个随机数种子,再用Rnd()生成0~1的随机数。如果只用Rnd()在某一时刻会生成固定的数字
-
利用Random生成随机数: 用Random类的实例对象,使用.Next()//0\~ Single最大值 .NextDouble() //0.0~1.0 NextBytes() //以byte字节类型的数据填充数组
-
get、set方法需要包裹在Property… End Property之间 ,Property… End Property而称为属性过程
-
数据类型判断函数:IsDate()IsNumeric()//除了数字还可以包含“±” IsArray() IsNothing()
-
Date变量在赋值的时候,需要用#来包含日期。如#6/6/2024 11:50:32 AM#
-
- With语句只是为了方便不用重复的去使用同一个变量来调用其方法 如下
rs.方法1() With rs
rs.方法2() =====> .方法1()
rs.方法3() .方法2()
.方法3()
End With
窗体
-
在窗体程序里,sender表示触发该属性事件的对象,e表示属性事件的信息
-
在Exit Function之前要指定函数的的返回值,Sub是过程,使用Exit Sub会按顺序执行别的Sub
面向对象
- 在Class定义某个字段,加private修饰符是为了防止别的类、模块访问,所以加了该修饰符的字段、方法、函数,都只能在该Class类中被访问
- 如果一个类里的成员加了Shared关键字,那这个方法可以直接通过类名.字段|类名.方法直接访问,而不需要创建类的对象!
- property的用法:其中注意如果如果在Property关键字前指定ReadOnly就只允许Get(读/取)如果指定WriteOnly就只允许Set(写/设)
Class Account
Private Username As String
Private pwd As String
Property Id() As String
Set(ByVal Value As String)
Username = Value
End Set
Get
Id = Username//这个是相当于Return UserName
End Get
End Property
-
Protected 只允许该类的子类调用父类的成员 Private 只有类内的成员可以使用,子类不能使用
-
Myclass.方法名() 用于当父类的方法被子类重写时,可以通过MyClass找到原来的方法
-
当没有写New构造函数时,系统会默认生成一个无参构造。如果加了参数,就是有参构造,并且通过重载的方式进行声明该构造函数。
-
多重继承是指多个接口继承某一个接口
-
继承的小案例
Public MustInherit Class Animal
Dim action As String = "我是动物"
Public MustOverride Sub Name()
Public Overridable Sub Voice()
Console.WriteLine(action)
End Sub
End Class
Class Dog
Inherits Animal
Overrides Sub Name()
Console.WriteLine("我是狗")
End Sub
Public Overrides Sub Voice()
Console.WriteLine("WangWangWang~")
End Sub
End Class
Class Cat
Inherits Animal
Public Overrides Sub Name()
Console.WriteLine("我是猫")
End Sub
End Class
Module 面向对象2
Sub Main()
Dim dg As Dog = New Dog
Dim ct As Cat = New Cat
'Dim an As Animal = New Dog
dg.Name()
dg.Voice()
ct.Name()
ct.Voice()
Console.ReadKey()
End Sub
End Module
- 接口多态的demo
Interface Animal
Function introduction() As String
End Interface
Class Dog
Implements Animal
Public Function introduction() As String Implements Animal.introduction
Return "我是狗"
End Function
End Class
Class Cat
Implements Animal
Public Function introduction() As String Implements Animal.introduction
Return "我是猫"
End Function
End Class
Module 面向对象2 '
Sub Main()
Dim c As Cat = New Cat
Dim d As Dog = New Dog
Console.WriteLine(c.introduction())
Console.WriteLine(d.introduction())
Console.ReadKey()
End Sub
End Module
事件
-
声明一个事件就是将原来的Sub或Function替换为Event 如:Public Event 事件名()
-
触发某事件,需要**(1)在主程序中使用WithEvents来创建事件的对象**,用法:WithEvents 对象实例 As New 这个事件所在类 (其定义对象实例方法类似于Dim,不过是把Dim换成了WithEvents关键字,一个是定义变量的关键字,一个是定义事件的关键字)
(2)用该事件的对象实例去直接调用其中的方法,如果这个方法里面Raise了要触发的事件,那么该事件就会被触发。
Public Class Stealer
Public Event RunAway()
Public Sub Steal()
Console.WriteLine("小偷在偷东西")
End Sub
Public Sub Hear(ByVal word As String)
Console.WriteLine("小偷听到了" & word & "的声音")
RaiseEvent RunAway() 'RaiseEvent触发某事件
End Sub
End Class
Module 事件的创建及触发 '
WithEvents Thief As New Stealer '创建事件的实例对象
Private Sub Theif_Run() Handles Thief.RunAway 'Run()处理该事件
Console.WriteLine("他知道警察发现他,于是跑了!")
End Sub
Sub Main()
Thief.Steal()
Thief.Hear("警笛声")
Console.ReadKey()
End Sub
End Module
异常处理
-
可以在Try里存放可能发生异常的代码,然后Catch e As Exception When 表达式 ,When后面的表达式接导致发生异常的语句,如除数=0
-
当Try语句里发生异常时,可以用Catch e As xxxException 随后打印e 可以捕获相对应的异常
-
如使用多重Catch,需要将特定异常放在一般异常(Exception)之前
-
若多个Catch块在确保一定会出现异常时但未抛出异常(未执行当前Catch语句),或者控制台抛某异常(说明Catch未生效,未捕获该异常),可能是没有使用嵌套Try
-
若要自定义异常类,需要先继承某个Exception类,随后自定义构造函数以确保在Try里可以用Throw New XxException来抛出该异常
日期Date
-
EndTime.Subtract(StartTime)//减去
-
New TimeSpan() 可以用来存放时间、日期
键盘事件
-
KeyPressEventArgs的属性参数e 可以用e.Handled = True/False 来表示KeyPress事件是否被处理
-
KeyPress在KeyDown和KeyUp事件之间
-
KeyPress的事件处理者是KeyPressEventArgs,其他两个键盘事件处理者是KeyEventArgs
-
KeyPress和KeyDown的区别:(1)只有按下具有KeyAsc码的按键(A-Z 0~9) KeyPress事件才会触发 而按下任何键都一定会触发KeyDown事件
鼠标事件
-
MouseEventArg的属性参数e 可以用e.Button=MouseButtons.Left/Right.Middle来判断按下了鼠标哪个键
-
MouseEventArgc处理MouseDown和MouseUp事件
-
计算控件移动后的新坐标:Button.Left = Button.Left + e.X - (Button.Width/2) (Top同理)
-
将数据存入剪切板:Clipboard.SetDataObject(TextBox1.Text)//把TextBox1.Text存入剪切板
-
获取剪切板的内容:Clipboard.GetDataObject().GetData(DataFomats.Text) //返回值为Text文本
控件
-
Button控件提供了一个PerformClick方法可以使控件产生一个点击事件
-
CheckBox是复选框,RadioBox是单选框,而GroupBox是他们两的结合
-
Timer控件可用于计时,用Timer1.Enabled = True/False 可以控制Timer1的触发事件的开关,从而使Timer1_Tick函数执行
绘图
-
DrawLine(pen,x(i),y(i),x(j),x(j)) <==> DrawLine(pen,p(i),p(j)) //推荐使用后者
-
画椭圆和画矩形的方式类似,不过匡在矩形里而定的椭圆,可以先画矩形再画椭圆
文件操作
-
OpenFileDialog, SaveFileDialog 是用于执行文件打开和保存的对话框控件
-
使用File类( 类似Math类)就可以直接用文件的各种方法来获取文件信息 ,但是如果要经常对同一个文件进行多次操作,每次都需要指定文件的路径,很不方便,所以这种情况适合用FileInfo类
-
要使用FileInfo类对某个文件(路径)进行多次操作时就必须创建FileInfo的实例对象。但只需要指定一次路径!后面可以反复使用其实例对象的方法! 使用方法:Dim file As New FileInfo(“路径”)
-
删除文件:file.Delete() //删除自己 创建文件:file.Creat()//创建空文件 这些方法都不需要指定参数就可以实现
-
磁盘目录服务:DirectoryInfo类同样也要创建它的实例对象才能使用,它的实例对象可以使用GetDirectories//获取当前子目录、GetFiles//获取当前子文件
-
由此可见,创建一个文件或目录的对象实例,最好的方式是用他们的Info类进行创建!
-
在父目录下创建子目录: 父目录名.CreatSubdirectory(“子目录的路径”)
-
获取指定路径下的 完整路径、根路径、文件名、目录名、系统的临时目录 ,以及变更指定路径扩展名的方法:Path.ChanggeExtension(“路径”,新的扩展名),这些涉及到与路径有关的,可以用Path内置类!