资讯动态

VB.NET 150例实战:把示例当练习册,拒绝死记硬背

发布时间:2026/10/14 10:19:07 来源:尧图企业网站定制
简介这是一份面向VB.NET学习者的150例实践教程资源包以可执行实例贯穿从基础到进阶的完整学习路径覆盖基本语法、函数与过程、面向对象编程、集合与数组、异常处理、文件和流操作、Windows窗体控件设计、ADO.NET数据库访问、多线程与网络通信、XML处理、反射与泛型等关键知识点适合初学者系统入门也适合有一定基础的开发者对照巩固和查漏补缺。压缩包共1190个文件以vb源代码、resx资源、vbproj项目及sln解决方案为主体配合少量aspx页面、CSS样式和ico图标等项目结构完整整体仅2.27MB便于下载和本地编译调试。目前已有201人学习。每个实例都是独立单元打开即可运行读者可通过逐例操作快速掌握VB.NET实战技巧从简单控件到数据库操作逐步进阶同时可以借助已有的资源文件与项目配置理解界面布局和编译设置是一份拿来即用的编程练手资料。1. VB.net 150例把示例当练习册而不是阅读材料VB.net 150例题面上是一组示例实际价值在于覆盖了入门 VB.NET 时最容易卡住的五个方向窗体控件、文件处理、正则与字符串、数据库访问、网络请求。对于刚入门的初学者或者要接手老项目的开发把 150 例当练习册而不是阅读材料是建立手感最快的路径只看不敲一周后基本忘光。这个标题背后真正的问题是如何不靠背语法而是靠复刻示例建立起对 .NET 类库的使用习惯。这篇笔记按我的实战习惯拆出分类方法、复刻步骤和踩坑记录照着走能把一个示例文件夹变成你自己的工具箱。2. 搭建 VB.NET 示例练习环境版本选择与多项目骨架2.1 选对开发工具与目标框架老示例跑不动的第一个原因VB.NET 这门语言从 .NET Framework 时代一路走到 .NET 8语法上变化不算大但项目模板和目标框架变了好几次。拿到 150 例这类示例集首先要判断示例基于哪个年代如果示例里大量使用System.Windows.Forms、My.Computer、OleDb这类命名空间大概率是 .NET Framework 4.x 时代产物如果示例用Imports System.Text.Json、HttpClient、Microsoft.Data.Sqlite那就是新框架风格。我一般建议在主流的 Visual Studio 2022 里装「.NET 桌面开发」工作负载创建项目时目标框架直接选 .NET Framework 4.8。原因很实在老示例在新框架下不一定能一次跑通而 .NET Framework 4.8 对 WinForms 和旧 API 的兼容性最好最适合当学习用的底座。控制台类的示例如果只是为了验证逻辑也可以选 .NET 8跨平台、启动快但窗体类示例建议统一用 .NET Framework 4.8别混着用混着用会出现项目引用和 NuGet 包版本对不上的问题。这里还有一个容易被忽视的点Visual Studio 的安装负载。很多人装完 VS 才发现新建项目里没有 Visual Basic 模板是因为安装时只勾了 C 或 Web 负载。VB 模板在「其他语言」分组下面必须手动勾选。初次环境配置的十五分钟决定了后面 150 例能跑通多少值得认真对待。2.2 搭建「示例练习仓库」把 150 例变成可追踪的工程150 个示例如果全部堆在一个解决方案里Visual Studio 打开慢、编译慢而且示例之间的依赖关系会互相干扰。我习惯按技术方向分成五到六个项目每个项目放一类的示例再用一个解决方案统一管理。这样的好处是某类示例改坏了不影响其他类查错范围小也符合实际项目里「按模块拆分」的习惯。文件结构大致是这样VB150/ ├── 01_ConsoleBasics/ ├── 02_WinFormsControls/ ├── 03_FileAndString/ ├── 04_Database/ ├── 05_RegexAndNet/ └── SharedUtils/用命令行创建这套骨架比在 VS 里一个个点快很多。安装了 .NET SDK 之后在终端里执行mkdir VB150 cd VB150 dotnet new sln -n VB150 dotnet new console -lang VB -n 01_ConsoleBasics -o 01_ConsoleBasics dotnet new winforms -lang VB -n 02_WinFormsControls -o 02_WinFormsControls dotnet new console -lang VB -n 03_FileAndString -o 03_FileAndString dotnet new console -lang VB -n 04_Database -o 04_Database dotnet new console -lang VB -n 05_RegexAndNet -o 05_RegexAndNet dotnet sln VB150.sln add 01_ConsoleBasics/01_ConsoleBasics.vbproj dotnet sln VB150.sln add 02_WinFormsControls/02_WinFormsControls.vbproj dotnet sln VB150.sln add 03_FileAndString/03_FileAndString.vbproj dotnet sln VB150.sln add 04_Database/04_Database.vbproj dotnet sln VB150.sln add 05_RegexAndNet/05_RegexAndNet.vbproj这段命令的逻辑先用dotnet new sln生成解决方案文件再按类别创建 VB 控制台或 WinForms 项目最后把各个.vbproj注册进解决方案。-lang VB是语言参数-o是输出目录。数字前缀01_、02_是为了让项目在解决方案资源管理器里按顺序排列避免后期项目多了排序混乱。提示如果本机没装 .NET SDK直接用 VS 的「新建项目」对话框也能做同样的事CLI 只是批量建骨架更快。WinForms 模板在 .NET 6 之后才支持跨平台编译所以 02_WinFormsControls 这个项目建议保留 .NET Framework 4.8 目标。3. 把 150 个示例拆成五类界面、文件、数据库、算法、网络3.1 界面类示例先跑再改把事件绑定的习惯养好界面类示例在 150 例里通常是占比最大的涉及 WinForms 控件的基本用法Button、TextBox、DataGridView、Timer、ComboBox 之类的布局和事件。这类示例的难点不在代码量而在对「事件驱动」的理解。很多初学者照抄代码跑起来没问题但换一个控件、换一个触发时机就不会写了本质是没有建立「控件事件 → 处理方法」的映射习惯。我的学习方法是四步走先运行看效果再打开设计器改属性然后双击控件生成事件处理骨架最后在骨架上补自己的逻辑。比如一个按钮示例双击按钮后 VS 会自动生成Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click这段骨架你要做的只是往里面填业务逻辑。重点观察两个地方一是Handles关键字后面的Button1.Click它声明了这个方法绑定的控件和事件如果控件改名了但 Handles 没同步更新事件就会静默失效二是sender参数它代表触发事件的控件对象很多通用处理方法要靠它来区分不同的调用来源。界面类还有一个值得养成的习惯不要直接在控件上写业务代码。比如登录窗口按钮点击后应该调用一个单独的LoginService.Validate(userName, password)方法而不是把数据库查询代码整个塞进按钮事件。这 150 例里如果某些示例是把全部逻辑写在控件事件里你可以在复刻时主动拆一层训练自己分离界面逻辑和业务逻辑这对后面的项目实战帮助很大。3.2 文件与字符串类示例最值得反复手敲的一类文件操作是 VB.NET 里出镜率最高的场景之一150 例里基本绕不开读写文本文件、批量改名、目录遍历、编码转换这几个方向。面向 .NET Framework 的示例习惯用My.Computer.FileSystem而新一点的示例用System.IO下的File、Directory、Path静态类。我推荐优先练System.IO这套它是跨框架通用的基础搞懂它之后再看My.Computer会觉得很容易。需要手敲到形成肌肉记忆的方法就这几个File.ReadAllText一次性读入文本、File.WriteAllText覆盖写入、Directory.GetFiles按通配符取文件名数组、Path.Combine安全拼接路径、Path.GetExtension取扩展名。记住它们不需要背参数表因为 Visual Studio 的智能提示会列出重载你需要记的是「什么时候用哪个方法」判断路径存不存在用Directory.Exists递归遍历子目录用Directory.GetDirectories只取当前目录下的特定类型文件用Directory.GetFiles(path, *.txt)。字符串这块最容易踩的是编码问题。读旧系统导出的 CSV 或 log 文件时如果文件是 GB2312 编码直接ReadAllText会乱码要显式指定编码File.ReadAllText(path, Encoding.GetEncoding(GB2312))。写文件时默认 UTF-8 没问题但读写不一致就会出乱码。150 例里如果有「文本文件读取与显示」这类示例建议顺手把编码参数的应用加进去这是未来实际工作中必定会遇到的状况。3.3 数据库类示例把连接串和 SQL 执行逻辑分开记数据库访问示例通常包括 SQL Server、Access、SQLite 三种。无论是哪一种ADO.NET 的执行套路是统一的先准备连接字符串再创建 Connection然后创建 Command执行最后关闭连接。这个套路我在 150 例里至少练了五六遍每换一种数据库就把连接字符串和参数化写法对照一遍记忆会非常牢固。以 SQLite 为例因为它单文件部署、不需要安装服务端是练习 ADO.NET 最佳的选择。连接串形如Data Sourcedemo.db;Version3;如果示例里用的是System.Data.SQLite包的SQLiteConnection那么创建连接、打开连接、执行 SQL 的命令对象和 SqlClient 的做法几乎一样。数据库类示例的核心不是背 API而是建立一个固定认知查询要放在ExecuteReader里逐行读增删改要放ExecuteNonQuery里执行取单个值用ExecuteScalar。参数化查询也是数据库示例里必须掌握的点。老示例里常见字符串拼接拼 SQL 的写法比如SELECT * FROM Student WHERE Name name 这个写法在练习时能跑通但放在真实环境里是严重安全隐患值中包含单引号时还会直接报错。我建议在复刻时主动把每个拼接 SQL 的示例改写成参数化写法。150 例里的数据库章节最终验收标准应该是任何一句 SQL 都带上参数不带拼接。3.4 算法与网络类示例不需要每个都精通但要能口述算法和网络这两类在 150 例里往往是用作补充。算法示例常见的是排序、递归、斐波那契数列网络示例常见的是 HTTP 请求、网页内容抓取。算法类的价值不在让你成为算法专家而在训练你读代码和拆问题的能力所以「能口述执行流程」比「能默写代码」更重要。比如冒泡排序只要心里清楚两两比较、交换、一轮一轮推进写出具体的代码只是时间问题。网络类示例则要注意新旧 API 的差异。老示例里大量使用WebClient新项目里官方推荐HttpClient。WebClient在新框架里虽然还能用但会提示过时或在新版本中缺失所以复刻时如果遇到网络请求直接改用HttpClient。用法上就是一个using声明、GetStringAsync或PostAsync方法配合 JSON 反序列化就能完成大部分场景。把五类拆完之后你会发现自己对 150 例的「体感」完全不一样了界面类练事件绑定文件类练静态方法数据库类练 ADO.NET 套路算法类练流程拆解网络类练客户端请求。每一类都有明确的目标而不是被示例带着走。4. 复刻三个高频 VB.NET 示例文件改名、正则校验、SQLite 存储4.1 批量文件改名工具Directory 与 File 的组合文件批量改名是文件类示例里最实用、最值得完整复刻的一个。它的核心逻辑是用Directory.GetFiles取出目录下所有匹配文件用File.Move做重命名再用Path类处理路径拼接。下面这段是可运行的完整版本Imports System.IO Module BatchRename Sub Main() Dim folderPath As String C:\Demo\Input Dim keyword As String 2024 Dim newPrefix As String INV- If Not Directory.Exists(folderPath) Then Console.WriteLine(目录不存在程序退出。) Return End If Dim files() As String Directory.GetFiles(folderPath, *.txt) Dim renameCount As Integer 0 For Each filePath As String In files Dim fileName As String Path.GetFileName(filePath) If fileName.Contains(keyword) Then Dim newName As String newPrefix fileName Dim newPath As String Path.Combine(folderPath, newName) If File.Exists(newPath) Then Console.WriteLine($跳过: {newName} 已存在) Continue For End If File.Move(filePath, newPath) renameCount 1 Console.WriteLine($重命名: {fileName} - {newName}) End If Next Console.WriteLine($完成共重命名{renameCount}个文件。) Console.ReadKey() End Sub End Module这段代码的逻辑说明先把目标目录和规则参数定义在变量里方便后面替换Directory.GetFiles(folderPath, *.txt)是取目录下所有 txt 文件返回字符串数组Path.GetFileName从完整路径中取出文件名Contains(keyword)过滤出包含指定关键词的文件Path.Combine把目录和目标文件名拼接成完整路径比手写folderPath \ newName更安全因为在不同系统上路径分隔符可能不同。其中三个参数值得说一下folderPath是要操作的目录改成你自己的测试目录keyword是筛选关键词只对文件名中包含该词的文件生效newPrefix是重命名后加在文件名前的前缀。如果你需要去掉某个前缀把newPrefix fileName修改成fileName.Replace(keyword, )就能实现。这个示例的边界坑在于如果新文件已经存在File.Move会抛异常所以提前加了File.Exists检查。不要刻意删掉这个检查实际工作中重名永远会出现。4.2 正则表达式验证器把规则和验证逻辑解耦正则类示例通常会让初学者一头雾水问题在于把「规则字符」和「验证逻辑」混在一起看。复刻一个验证器把规则放在字典里、验证逻辑独立出来这个抽象思路比任何单个正则表达式都重要。下面是一个控制台版的小验证器Imports System.Text.RegularExpressions Module RegexValidator Sub Main() Dim patterns As New Dictionary(Of String, String) From { {邮箱, ^[\w.-][\w-](\.[\w-])$}, {手机号, ^1[3-9]\d{9}$}, {IP地址, ^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$} } Console.Write(输入待验证的字符串: ) Dim input As String Console.ReadLine() For Each pair As KeyValuePair(Of String, String) In patterns Dim isMatch As Boolean Regex.IsMatch(input, pair.Value) Console.WriteLine(${pair.Key}: {(If(isMatch, 通过, 不通过))}) Next Console.ReadKey() End Sub End Module逻辑说明Dictionary(Of String, String)把规则名称和正则表达式配对存储Regex.IsMatch(input, pair.Value)对输入字符串逐条做匹配If(isMatch, 通过, 不通过)是 VB 里的三元表达式替代写法。运行时用户在控制台输入一串字符串程序会分别按邮箱、手机号、IP 地址三个规则去匹配并输出结果。参数说明里最重要的是三个正则表达式的结构。邮箱规则^[\w.-][\w-](\.[\w-])$里的^和$表示整串匹配不是部分匹配手机号规则^1[3-9]\d{9}$是十一位数字校验以 1 开头第二位是 3 到 9IP 地址规则里的25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d表示分段数值必须在 0 到 255 之间。如果你在 150 例里看到某个示例的规则写法和你预期不符优先检查^和$以及转义符号\d、\w是否完整。正则这块没有捷径宁可多备几个常用规则存成字典也不要每次临时拼。4.3 SQLite 数据访问示例轻量数据库的增删改查骨架数据库示例里SQLite 是最适合作为练习骨架的因为它不需要安装数据库服务一个.db文件就能跑起来。下面代码用System.Data.SQLite包演示了建表、插入、查询三个基本动作Imports System.Data.SQLite Module SqliteDemo Sub Main() Dim connStr As String Data Sourcedemo.db;Version3; Dim connection As New SQLiteConnection(connStr) connection.Open() Dim createSql As String CREATE TABLE IF NOT EXISTS Student ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Score REAL DEFAULT 0); Dim cmd As New SQLiteCommand(createSql, connection) cmd.ExecuteNonQuery() Dim insertSql As String INSERT INTO Student(Name, Score) VALUES(name, score); Dim insertCmd As New SQLiteCommand(insertSql, connection) insertCmd.Parameters.AddWithValue(name, 张三) insertCmd.Parameters.AddWithValue(score, 92.5) insertCmd.ExecuteNonQuery() Dim selectSql As String SELECT Id, Name, Score FROM Student ORDER BY Score DESC; Dim selectCmd As New SQLiteCommand(selectSql, connection) Using reader As SQLiteDataReader selectCmd.ExecuteReader() While reader.Read() Console.WriteLine($ID{reader(Id)}, 姓名{reader(Name)}, 成绩{reader(Score)}) End While End Using connection.Close() Console.ReadKey() End Sub End Module逻辑说明连接字符串里Data Source指定数据库文件路径Version3是 SQLite 版本标识。打开连接后先执行CREATE TABLE IF NOT EXISTS保证表结构存在再用参数化插入语句写入一条数据最后用ExecuteReader读取结果并逐行输出。Using语句确保 reader 在使用结束后被释放这是资源管理的好习惯。参数说明要重点看AddWithValue(name, 张三)。这里的name是 SQL 语句里的命名参数值通过参数对象传入而不是拼进 SQL 字符串。这样做有两个收益一是避免 SQL 注入二是解决字符串中带单引号导致 SQL 语法错误的问题。如果你在 150 例里看到的数据库示例是直接用拼接 SQL 的建议全部改成这种参数化写法。另外Data Source如果不写绝对路径数据库文件会生成在程序运行目录下确认当前工作目录再找文件不要满磁盘翻。5. 照抄示例翻车排查VB.NET 常见编译与运行坑5.1 现象代码完全一样却报「名称未声明」或类型转换错照抄示例经常遇到一种情况明明代码是从示例里复制出来的自己的项目却报BC30451名称未声明或BC30512Option Strict 禁止隐式转换。原因不在代码而在项目默认配置不同。老示例项目通常关闭了Option Explicit和Option Strict允许未声明变量和隐式类型转换新项目模板默认开启严格检查这两种行为会导致同样的代码在不同的项目设置下有完全不同的编译结果。解决方法是显式控制这两个开关在源码文件顶部加Option Explicit On和Option Strict On让代码的行为不依赖项目默认值。如果你的目的是先把示例跑通可以在项目属性里暂时关掉Option Strict但练完之后建议重新打开严格要求自己写出的代码能通过严格检查因为这样才能尽早暴露类型问题。5.2 现象打开老示例窗体控件布局乱飞、文字重叠WinForms 示例在带高分屏的电脑上打开设计器控件经常错位、字体大小异常。这类问题通常有两个来源一是设计器文件里的AutoScaleMode默认值和当前系统 DPI 不一致二是老示例窗体没有设置AutoScaleDimensions在高 DPI 下缩放失效。解决办法是在窗体设计器里把AutoScaleMode设为Dpi并设置合适的AutoScaleDimensions同时将窗体的Font显式指定为常见字体比如 Microsoft YaHei UI。这一步不是玄学是高分屏普及后每个 WinForms 开发者都要补的课。5.3 现象按钮写了事件方法点击却没有反应事件不触发的翻车率相当高。原因是事件处理方法和控件之间的绑定关系丢失了。在 VB.NET 里绑定关系通过Handles关键字声明比如Private Sub BtnSave_Click(...) Handles BtnSave.Click当你在代码里手动把BtnSave改名成SaveButton之后如果事件方法里的Handles子句没有同步更新按钮点击时找不到处理方法自然毫无反应。解决方法是不要手写事件处理方法的绑定而是回到设计器双击控件让 VS 自动生成方法骨架和绑定声明。养成用设计器生成事件骨架的习惯可以避免一大类这种「看似正确却失效」的问题。5.4 现象老示例能跑但新框架提示 API 过时或直接不支持网络、文件、配置读取这三类示例最常撞上 API 版本问题。典型的是WebClient和My.Computer.Network它们在 .NET Core / 现代框架里要么提示过时要么直接缺失。复刻这类示例时不用硬撑着用旧 API把WebClient替换成HttpClient是标准迁移路径文件读取方面File.OpenRead、StreamReader仍然通用影响不大。遇到这种问题先查目标框架再去改代码别盲目在旧 API 里找解决方案。5.5 现象循环里大量用拼接字符串界面越来越卡字符串拼接是新手最容易写坏代码铁的地方。在For循环里用拼接字符串每拼一次都会在内存里创建一个新的字符串对象循环次数一多运行效率明显下降甚至引发 UI 线程卡顿。修正是把拼接对象换成StringBuilder。它维护一个可变的字符缓冲区拼接不会反复创建新对象。150 例里凡是涉及循环拼 SQL、循环拼日志文本的示例你在复刻时顺手改写成StringBuilder写法既练了习惯也为以后处理大文本做好了准备。6. 150 例之后怎么验收组合式重构一个完整小工具跑完 150 例不代表结束真正的验收标准是你能不能把三五个示例组合成一个新的完整工具。我建议做一个「批量文件分类小助手」用文件类示例的Directory.GetFiles读取指定目录所有文件用正则示例的规则从文件名里提取日期或类型关键词用 SQLite 示例记录处理日志再用 WinForms 示例做一个带进度条的简单界面。这个小工具把五个方向的示例都串起来了做完它你对 150 例的掌握程度就有了明确答案。验收时给自己定三条标准第一脱稿完成核心逻辑不再回头看示例原码第二把原来示例里的固定值改成可配置参数比如目录路径、正则规则、表名第三能给一个没看过这些例子的同事讲清楚每一步在做什么。能做到这三点说明你不是在抄代码而是在用工具箱搭东西。我自己的教训是读示例和写示例之间隔着一段巨大的距离。以前看二叉树示例时觉得很简单真到自己从头写才意识到递归的出口条件和回溯顺序不是靠记忆能解决的必须动手画一遍流程。后来我养成了一个习惯每复刻一个示例就在代码文件头部写两行注释一行记录「这个示例解决什么问题」一行记录「换一个需求场景该怎么改动」。这个习惯让我在真正做项目时能快速想起某个功能该用哪段示例作起点。希望这篇文章能帮你在面对 VB.net 150 例时少走弯路把示例真正变成自己的东西。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑