当前位置: 首页 > news >正文

VB.NET 从入门到精通:开启编程进阶之路

摘要: 本文全面深入地阐述了 VB.NET 的学习路径,从基础的环境搭建与语法入门开始,逐步深入到面向对象编程、图形用户界面设计、数据访问、异常处理、多线程编程以及与其他技术的集成等核心领域,通过详细的代码示例与理论讲解,为读者构建起系统学习 VB.NET 的知识框架,助力读者从 VB.NET 初学者成长为精通该语言的专业开发者,能够熟练运用 VB.NET 开发出功能强大、界面友好且高效稳定的应用程序。

一、引言

Visual Basic.NET(VB.NET)作为微软.NET 框架中的重要编程语言,融合了传统 Visual Basic 的易用性与.NET 框架的强大功能和跨平台特性。它为开发者提供了丰富的类库和工具,无论是开发 Windows 桌面应用程序、Web 应用程序,还是进行数据库编程、系统服务开发等,VB.NET 都展现出了卓越的适应性和高效性。对于想要踏入编程世界或者从其他语言转型的开发者来说,学习 VB.NET 是一个极具价值的选择,它能够帮助开发者快速构建出功能完备的应用程序,并深入理解面向对象编程、软件架构设计等重要的编程概念和技术。

二、VB.NET 基础入门

(一)环境搭建

  1. 安装 Visual Studio
    要开始学习 VB.NET,首先需要安装 Visual Studio 开发环境。Visual Studio 是微软提供的一套集成开发环境(IDE),支持多种编程语言,包括 VB.NET。可以从微软官方网站下载 Visual Studio 的安装程序,在安装过程中,选择安装 VB.NET 相关的工作负载和组件。例如,选择 “.NET 桌面开发” 工作负载,该工作负载将包含创建 Windows 桌面应用程序所需的 VB.NET 模板、编译器以及调试工具等。安装完成后,启动 Visual Studio,即可开始创建 VB.NET 项目。
  2. 创建第一个 VB.NET 项目
    在 Visual Studio 中,点击 “新建项目”,在项目模板中选择 “Visual Basic” 语言,然后可以选择不同类型的项目模板,如 “Windows 窗体应用程序”(用于创建传统的 Windows 桌面应用)、“控制台应用程序”(用于创建命令行应用程序)等。以创建一个简单的控制台应用程序为例,选择 “控制台应用程序” 模板,输入项目名称和存储位置后,点击 “确定”,Visual Studio 将自动创建一个包含基本结构的 VB.NET 控制台应用项目,其中包含一个名为 Module1.vb 的模块文件,在这个文件中可以编写 VB.NET 代码。

(二)基础语法

  1. 变量与数据类型
    VB.NET 是一种强类型语言,变量在使用前必须声明类型。例如,声明一个整数变量:Dim num As Integer = 10,这里 Dim 是声明变量的关键字,num 是变量名,As Integer 表示变量的类型为整数,= 10 是对变量进行初始化赋值。VB.NET 支持多种数据类型,包括整数类型(IntegerLong 等)、浮点数类型(SingleDouble)、字符类型(Char)、字符串类型(String)、布尔类型(Boolean)等。例如:
Dim name As String = "John"
Dim age As Integer = 25
Dim isStudent As Boolean = True

在上述示例中,分别声明并初始化了一个字符串变量 name、一个整数变量 age 和一个布尔变量 isStudent
2. 控制结构
VB.NET 提供了常见的控制结构,如条件语句和循环语句。条件语句包括 If...Then...Else 语句,用于根据条件执行不同的代码块。例如:

Dim score As Integer = 85
If score >= 90 ThenConsole.WriteLine("优秀")
ElseIf score >= 80 ThenConsole.WriteLine("良好")
ElseIf score >= 60 ThenConsole.WriteLine("及格")
ElseConsole.WriteLine("不及格")
End If

在上述示例中,根据变量 score 的值判断成绩等级并输出相应信息。循环语句包括 For...Next 循环、While...End While 循环和 Do...Loop 循环。例如,For...Next 循环用于指定次数的循环:

For i As Integer = 1 To 10Console.WriteLine(i)
Next i

上述代码将输出 1 到 10 的整数。While...End While 循环则在条件满足时持续执行循环体,例如:

Dim j As Integer = 1
While j <= 5Console.WriteLine(j)j += 1
End While

该循环将输出 1 到 5 的整数。Do...Loop 循环有两种形式,一种是先执行循环体再判断条件(Do...Loop While),另一种是先判断条件再执行循环体(Do While...Loop),例如:

Dim k As Integer = 1
DoConsole.WriteLine(k)k += 1
Loop While k <= 3

此代码将输出 1 到 3 的整数。

(三)函数与过程

  1. 函数定义与调用
    在 VB.NET 中,函数是一段可重复调用的代码块,用于执行特定的任务并返回一个值。函数使用 Function 关键字定义,例如:
Function AddNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As IntegerReturn num1 + num2
End Function

在上述示例中,定义了一个名为 AddNumbers 的函数,它接受两个整数参数 num1 和 num2,并返回它们的和。函数可以在其他代码中被调用,例如:

Dim result As Integer = AddNumbers(5, 3)
Console.WriteLine(result)

上述代码调用 AddNumbers 函数并将结果输出,将显示 8。
2. 过程定义与调用
过程与函数类似,但过程不返回值,使用 Sub 关键字定义。例如:

Sub PrintMessage(ByVal message As String)Console.WriteLine(message)
End Sub

上述过程 PrintMessage 接受一个字符串参数 message 并将其输出到控制台。过程的调用如下:

PrintMessage("Hello, VB.NET!")

这将在控制台输出 “Hello, VB.NET!”。

三、面向对象编程

(一)类与对象

  1. 类的定义
    VB.NET 是面向对象编程语言,类是面向对象编程的核心概念之一。类用于定义对象的属性和行为。例如,定义一个简单的 Person 类:
Class PersonPrivate _name As StringPrivate _age As IntegerPublic Property Name() As StringGetReturn _nameEnd GetSet(ByVal value As String)_name = valueEnd SetEnd PropertyPublic Property Age() As IntegerGetReturn _ageEnd GetSet(ByVal value As Integer)_age = valueEnd SetEnd PropertyPublic Sub Speak()Console.WriteLine($"我叫 {_name},今年 {_age} 岁。")End Sub
End Class

在上述 Person 类中,定义了两个私有字段 _name 和 _age,以及对应的公共属性 Name 和 Age,用于访问和修改私有字段的值。还定义了一个公共方法 Speak,用于输出人员的信息。
2. 对象的创建与使用
创建类的对象后,就可以使用对象的属性和方法。例如:

Dim person1 As New Person()
person1.Name = "Alice"
person1.Age = 30
person1.Speak()

上述代码创建了一个 Person 类的对象 person1,设置了其姓名和年龄属性,并调用了 Speak 方法,将输出 “我叫 Alice,今年 30 岁。”

(二)继承与多态

  1. 继承机制
    继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。例如,定义一个 Student 类继承自 Person 类:
Class StudentInherits PersonPrivate _studentId As StringPublic Property StudentId() As StringGetReturn _studentIdEnd GetSet(ByVal value As String)_studentId = valueEnd SetEnd PropertyPublic Overrides Sub Speak()Console.WriteLine($"我是学生 {_name},学号是 {_studentId},今年 {_age} 岁。")End Sub
End Class

在上述 Student 类中,通过 Inherits 关键字继承了 Person 类的属性和方法,并新增了一个私有字段 _studentId 和对应的公共属性 StudentId,还重写了父类的 Speak 方法,以适应学生对象的信息输出需求。
2. 多态性体现
多态性使得不同类的对象可以对相同的方法调用做出不同的响应。例如:

Dim person2 As New Person()
person2.Name = "Bob"
person2.Age = 40
person2.Speak()Dim student2 As New Student()
student2.Name = "Charlie"
student2.Age = 20
student2.StudentId = "S12345"
student2.Speak()

在上述示例中,创建了 Person 类和 Student 类的对象,并分别调用了 Speak 方法,由于 Student 类重写了 Speak 方法,所以两个对象的 Speak 方法输出不同的信息,体现了多态性。

四、图形用户界面设计

(一)Windows 窗体基础

  1. 创建 Windows 窗体应用程序
    在 Visual Studio 中,选择 “Windows 窗体应用程序” 模板创建一个新的项目,即可开始设计 Windows 窗体界面。项目创建后,会自动生成一个主窗体(通常名为 Form1.vb),在设计视图中,可以从工具箱中拖放各种控件到窗体上,如按钮(Button)、文本框(TextBox)、标签(Label)等。例如,拖放一个按钮和一个文本框到窗体上,然后可以在属性窗口中设置控件的各种属性,如按钮的文本(Text 属性)、文本框的初始值(Text 属性)等。
  2. 控件的使用与事件处理
    在 Windows 窗体应用程序中,控件的交互通过事件处理来实现。例如,为按钮添加一个点击事件处理程序。在设计视图中,双击按钮,Visual Studio 会自动生成按钮点击事件的处理方法框架,例如:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click' 在这里编写按钮点击后要执行的代码Dim inputText As String = TextBox1.TextMessageBox.Show($"你输入的内容是:{inputText}")
End Sub

在上述示例中,当用户点击按钮时,会获取文本框中的文本,并通过消息框显示出来。通过这种方式,可以实现各种用户交互功能,如数据输入、界面更新等。

(二)布局管理与界面美化

  1. 布局容器与控件布局
    为了使 Windows 窗体界面在不同分辨率和窗口大小下保持良好的布局,需要使用布局容器。常见的布局容器有 TableLayoutPanel(表格布局面板)、FlowLayoutPanel(流布局面板)等。例如,使用 TableLayoutPanel 来布局多个控件:
Dim tableLayoutPanel1 As New TableLayoutPanel()
tableLayoutPanel1.ColumnCount = 2
tableLayoutPanel1.RowCount = 2Dim label1 As New Label()
label1.Text = "姓名:"
Dim textBox1 As New TextBox()
tableLayoutPanel1.Controls.Add(label1, 0, 0)
tableLayoutPanel1.Controls.Add(textBox1, 1, 0)Dim label2 As New Label()
label2.Text = "年龄:"
Dim textBox2 As New TextBox()
tableLayoutPanel1.Controls.Add(label2, 0, 1)
tableLayoutPanel1.Controls.Add(textBox2, 1, 1)Me.Controls.Add(tableLayoutPanel1)

在上述示例中,创建了一个 TableLayoutPanel 并设置了 2 列 2 行,然后将标签和文本框控件添加到表格布局面板的相应单元格中,最后将布局面板添加到窗体上,这样可以确保控件在窗体大小改变时保持相对位置和大小的稳定。
2. 界面美化与主题应用
为了使 Windows 窗体应用程序的界面更加美观,可以应用不同的主题或自定义界面样式。可以使用第三方的界面库,如 DevExpressTelerik 等,这些库提供了丰富的界面控件和主题样式,可以轻松实现专业级的界面设计。例如,安装并引用 DevExpress 库后,可以在项目中使用其控件和主题。在窗体的 Load 事件中,可以设置主题,例如:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDevExpress.XtraEditors.WindowsFormsSettings.SetPerMonitorDpiAware()DevExpress.XtraEditors.WindowsFormsSettings.AllowFormGlass = DevExpress.Utils.DefaultBoolean.TrueDevExpress.XtraEditors.WindowsFormsSettings.DefaultLookAndFeel.SetSkinStyle("Office 2019 Colorful")
End Sub

上述代码将应用 “Office 2019 Colorful” 主题到窗体上,使界面看起来更加美观和现代化。

五、数据访问

(一)ADO.NET 基础

  1. 连接数据库
    ADO.NET 是 VB.NET 中用于数据访问的重要技术。首先,需要建立与数据库的连接。例如,连接到 SQL Server 数据库:
Imports System.Data.SqlClientDim connectionString As String = "Data Source=localhost;Initial Catalog=MyDatabase;User ID=sa;Password=123456"
Dim connection As New SqlConnection(connectionString)
Tryconnection.Open()Console.WriteLine("数据库连接成功!")
Catch ex As SqlExceptionConsole.WriteLine($"数据库连接错误:{ex.Message}")
FinallyIf connection.State = ConnectionState.Open Thenconnection.Close()End If
End Try

在上述示例中,使用 SqlConnection 类建立与 SQL Server 数据库的连接,指定了数据库服务器地址(localhost)、数据库名称(MyDatabase)、用户名(sa)和密码(123456)。通过 Try...Catch...Finally 块来处理数据库连接过程中可能出现的异常,并在最后确保关闭数据库连接。
2. 执行 SQL 查询
建立连接后,可以执行 SQL 查询语句。例如,执行一个简单的查询语句并获取结果:

Dim sql As String = "SELECT * FROM Customers"
Dim command As New SqlCommand(sql, connection)
Dim reader As SqlDataReader
Tryreader = command.ExecuteReader()While reader.Read()Dim customerId As Integer = reader.GetInt32(0)Dim customerName As String = reader.GetString(1)Console.WriteLine($"客户 ID:{customerId},客户姓名:{customerName}")End While
Catch ex As SqlExceptionConsole.WriteLine($"查询错误:{ex.Message}")
FinallyIf reader IsNot Nothing Thenreader.Close()End If
End Try

在上述示例中,使用 SqlCommand 类创建一个 SQL 查询命令,然后使用 ExecuteReader 方法执行查询并返回一个 SqlDataReader 对象,通过循环读取 SqlDataReader 中的数据行,获取客户的 ID 和姓名信息并输出。

(二)数据绑定与数据集

  1. 数据绑定到控件
    在 Windows 窗体或 Web 窗体应用程序中,可以将数据绑定到控件上,实现数据的可视化展示。例如,将一个 DataGridView 控件绑定到数据库查询结果:
Dim dataAdapter As New SqlDataAdapter(sql, connection)
Dim dataSet As New DataSet()
TrydataAdapter.Fill(dataSet, "Customers")DataGridView1.DataSource = dataSet.Tables("Customers")
Catch ex As SqlExceptionConsole.WriteLine($"数据填充错误:{ex.Message}")
End Try

在上述示例中,使用 SqlDataAdapter 从数据库中获取数据并填充到 DataSet 中,然后将 DataSet 中的 “Customers” 表绑定到 DataGridView 控件上,这样 DataGridView 就会自动显示数据库中的客户数据。

  1. 数据集的操作与更新
    DataSet 不仅可以用于数据展示,还可以在内存中对数据进行操作和更新,然后将更新后的数据回写到数据库中。例如:
' 假设已经有一个填充好数据的 DataSet 和相应的 DataAdapter
Dim newRow As DataRow = dataSet.Tables("Customers").NewRow()
newRow("CustomerName") = "New Customer"
newRow("ContactNumber") = "1234567890"
dataSet.Tables("Customers").Rows.Add(newRow)Dim commandBuilder As New SqlCommandBuilder(dataAdapter)
TrydataAdapter.Update(dataSet, "Customers")Console.WriteLine("数据更新成功!")
Catch ex As SqlExceptionConsole.WriteLine($"数据更新错误:{ex.Message}")
End Try

在上述示例中,首先创建一个新的 DataRow,并设置相应的列值,然后将其添加到 DataSet 中 “Customers” 表的 Rows 集合里。接着,通过 SqlCommandBuilder 根据已有的 DataAdapter 自动生成用于数据更新的 SQL 命令(如 INSERTUPDATE 和 DELETE 语句)。最后调用 DataAdapter 的 Update 方法,将 DataSet 中的更改应用到数据库中。如果更新过程中出现错误,会被 Catch 块捕获并输出错误信息。这种数据操作和更新方式使得开发者可以在脱离数据库直接连接的情况下,方便地处理和修改数据,然后一次性将更改持久化到数据库,提高了数据处理的灵活性和效率,尤其适用于需要批量处理数据或者在网络环境不稳定时先在本地缓存数据进行操作的场景。

六、异常处理与调试

(一)异常处理机制

  1. Try...Catch...Finally 结构
    VB.NET 提供了强大的异常处理机制,以 Try...Catch...Finally 结构为核心。在可能出现异常的代码块周围使用 Try 块包裹,当异常发生时,程序流程会跳转到相应的 Catch 块进行处理。例如:
TryDim x As Integer = 10Dim y As Integer = 0Dim result As Integer = x / y ' 这里会引发 DivideByZeroException 异常
Catch ex As DivideByZeroExceptionConsole.WriteLine($"除数不能为零:{ex.Message}")
FinallyConsole.WriteLine("无论是否发生异常,这里都会执行。")
End Try

在上述示例中,尝试进行除法运算时,由于除数为零会引发 DivideByZeroException 异常。异常被 Catch 块捕获后,会输出错误信息,而 Finally 块中的代码无论是否发生异常都会执行,通常用于释放资源或进行一些清理工作,如关闭文件流、数据库连接等,确保程序的稳定性和资源的正确管理。
2. 自定义异常类
除了使用系统内置的异常类,开发者还可以根据需要自定义异常类。自定义异常类通常继承自 System.Exception 类或其子类。例如:

Public Class MyCustomExceptionInherits ExceptionPublic Sub New(ByVal message As String)MyBase.New(message)End Sub
End Class

然后可以在代码中抛出和捕获自定义异常:

TryThrow New MyCustomException("这是一个自定义异常。")
Catch ex As MyCustomExceptionConsole.WriteLine(ex.Message)
End Try

通过自定义异常类,可以更好地组织和处理与特定业务逻辑相关的异常情况,使异常信息更具针对性和可读性,便于调试和维护代码,提高程序的健壮性和可维护性,尤其是在大型项目中,能够清晰地区分不同模块或功能引发的异常类型,有助于快速定位和解决问题。

(二)调试技巧与工具

  1. 断点设置与调试运行
    在 Visual Studio 中,可以在代码中设置断点来暂停程序的执行,以便检查程序的状态和变量的值。在代码行号旁边点击即可设置断点。设置断点后,通过调试运行(按 F5 键)程序,当执行到断点处时,程序会暂停,此时可以查看变量的值、调用堆栈等信息。例如,在一个复杂的计算过程中设置断点,当程序暂停时,可以检查中间变量的值是否符合预期,从而发现可能存在的逻辑错误。还可以使用 “逐语句”(F11 键)、“逐过程”(F10 键)等调试命令来逐步执行程序,深入了解程序的执行流程,对于排查难以重现的间歇性错误或者理解复杂算法的执行细节非常有帮助。
  2. 使用调试窗口
    Visual Studio 提供了多个调试窗口来辅助调试。“局部变量” 窗口显示当前作用域内的局部变量及其值,方便随时查看变量的变化情况。“监视” 窗口可以手动添加需要监视的变量或表达式,即使变量不在当前作用域内,也能持续跟踪其值的变化。“调用堆栈” 窗口展示了当前程序执行的函数调用序列,从当前执行的函数开始,依次向上显示调用它的函数,通过查看调用堆栈,可以了解程序是如何到达当前执行点的,对于分析函数调用关系和查找错误根源非常有用,特别是在多层嵌套函数调用中出现异常时,可以快速定位到最初引发异常的函数调用位置,有助于深入理解程序的运行时行为并进行针对性的调试和优化。

七、多线程编程

(一)线程的创建与启动

  1. 使用 Thread 类创建线程
    在 VB.NET 中,可以使用 Thread 类来创建和启动线程。例如:
Imports System.ThreadingSub ThreadMethod()Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 开始执行。")For i As Integer = 1 To 10Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId}:{i}")Thread.Sleep(1000) ' 暂停线程 1 秒End ForConsole.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 执行完毕。")
End SubSub Main()Dim thread As New Thread(AddressOf ThreadMethod)thread.Start()Console.WriteLine($"主线程 {Thread.CurrentThread.ManagedThreadId} 继续执行其他任务。")
End Sub

在上述示例中,首先定义了一个线程方法 ThreadMethod,在该方法中输出线程的相关信息并进行一个简单的循环计数,每次循环暂停 1 秒。然后在 Main 方法中创建一个新的线程,将 ThreadMethod 作为线程的执行方法,并启动该线程。主线程在启动子线程后继续执行其他任务,这样可以实现多任务的并发执行,提高程序的执行效率,例如在后台处理一些耗时的计算任务或者网络请求时,不影响主线程对用户界面的响应或其他重要任务的执行进度。
2. 线程的参数传递
有时需要向线程方法传递参数,可以通过创建一个包含参数的类或结构,并将其作为线程方法的参数来实现。例如:

Class ThreadDataPublic Message As StringPublic Delay As Integer
End ClassSub ThreadMethodWithParams(ByVal data As ThreadData)Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 开始执行,参数:{data.Message}")For i As Integer = 1 To 10Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId}:{i} - {data.Message}")Thread.Sleep(data.Delay)End ForConsole.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 执行完毕。")
End SubSub Main()Dim data As New ThreadData()data.Message = "自定义消息"data.Delay = 500Dim thread As New Thread(AddressOf ThreadMethodWithParams)thread.Start(data)Console.WriteLine($"主线程 {Thread.CurrentThread.ManagedThreadId} 继续执行其他任务。")
End Sub

在上述示例中,创建了一个 ThreadData 类来封装线程参数,包括一个消息字符串和一个延迟时间。ThreadMethodWithParams 方法接受 ThreadData 类型的参数,并在线程执行过程中使用这些参数。在 Main 方法中创建并初始化 ThreadData 对象,然后将其传递给线程启动方法,这样就可以根据不同的参数需求启动多个具有不同行为的线程,增强了线程的灵活性和复用性,适用于需要根据不同条件或数据进行并发处理的场景,如多任务数据处理或多个网络请求并发发送且每个请求具有不同参数的情况。

(二)线程同步与资源共享

  1. 锁机制(Lock)
    当多个线程访问共享资源时,可能会出现数据不一致或冲突的问题,需要使用线程同步机制。Lock 语句是一种简单有效的线程同步方式。例如:
Class SharedDataPublic Shared Counter As Integer
End ClassSub IncrementCounter()Lock (GetType(SharedData))SharedData.Counter += 1End Lock
End SubSub Main()Dim thread1 As New Thread(AddressOf IncrementCounter)Dim thread2 As New Thread(AddressOf IncrementCounter)thread1.Start()thread2.Start()thread1.Join()thread2.Join()Console.WriteLine($"共享计数器的值:{SharedData.Counter}")
End Sub

在上述示例中,定义了一个共享数据类 SharedData,其中包含一个共享的整数计数器 CounterIncrementCounter 方法用于递增计数器的值,通过 Lock 语句锁定 SharedData 类的类型对象,确保在同一时间只有一个线程能够进入锁定块并修改计数器的值,避免了多个线程同时修改导致的数据错误,保证了共享资源在多线程环境下的正确性和一致性,适用于多个线程对同一全局变量、数据结构或资源池进行读写操作的场景,如多线程对共享数据库连接池、缓存数据的访问控制等。
2. 其他同步工具(如 Monitor、Semaphore)
除了 Lock 语句,VB.NET 还提供了其他线程同步工具。Monitor 类提供了更强大的同步功能,它可以实现等待 / 通知机制,允许一个线程等待某个条件满足后再继续执行。例如:

Class SharedDataWithMonitorPublic Shared Counter As IntegerPublic Shared MonitorObject As New Object()
End ClassSub IncrementCounterWithMonitor()SyncLock SharedDataWithMonitor.MonitorObjectSharedDataWithMonitor.Counter += 1End SyncLock
End SubSub WaitAndIncrementCounter()SyncLock SharedDataWithMonitor.MonitorObjectWhile SharedDataWithMonitor.Counter < 5Monitor.Wait(SharedDataWithMonitor.MonitorObject)End WhileSharedDataWithMonitor.Counter += 1Monitor.PulseAll(SharedDataWithMonitor.MonitorObject)End SyncLock
End SubSub Main()Dim thread1 As New Thread(AddressOf IncrementCounterWithMonitor)Dim thread2 As New Thread(AddressOf WaitAndIncrementCounter)thread1.Start()thread2.Start()thread1.Join()thread2.Join()Console.WriteLine($"共享计数器的值:{SharedDataWithMonitor.Counter}")
End Sub

在上述示例中,WaitAndIncrementCounter 方法使用 Monitor 类的 Wait 方法等待计数器达到特定值,当条件满足后,递增计数器并使用 PulseAll 方法通知其他可能正在等待的线程。Semaphore 则用于控制对有限资源的访问数量,例如限制同时访问某个文件或网络资源的线程数量,通过设置信号量的初始值和最大等待数量,可以有效地管理资源的并发访问,避免资源过度占用或耗尽,保障系统的稳定性和资源的合理利用,在多线程并发访问有限资源的场景中具有重要应用,如多线程下载文件时限制同时下载的连接数、多线程访问数据库连接池时控制并发连接数量等。

八、VB.NET 与其他技术的集成

(一)与 Windows API 交互

  1. 调用 Windows API 函数
    VB.NET 可以通过 Declare 语句调用 Windows API 函数,以扩展其功能并实现一些底层的系统操作。例如,调用 MessageBox 函数显示一个消息框:
Public Class Form1<System.Runtime.InteropServices.DllImport("user32.dll")>Public Shared Function MessageBox(ByVal hWnd As IntPtr, ByVal text As String, ByVal caption As String, ByVal type As UInteger) As IntegerEnd FunctionPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim result As Integer = MessageBox(IntPtr.Zero, "这是一个来自 Windows API 的消息框。", "API 示例", 0)End Sub
End Class

在上述示例中,首先使用 DllImport 特性声明了 MessageBox 函数,指定了函数所在的动态链接库(user32.dll)。然后在按钮点击事件中调用该函数,显示一个简单的消息框。通过调用 Windows API 函数,可以实现一些在 VB.NET 标准库中难以直接实现的功能,如获取系统信息、控制窗口外观和行为、进行低级别的输入输出操作等,为 VB.NET 应用程序提供了更强大的系统级交互能力,例如开发一些与系统紧密结合的工具软件或者需要特殊界面效果和系统功能集成的应用程序时非常有用。
2. 处理 Windows API 回调函数
有些 Windows API 函数需要传递回调函数作为参数,在 VB.NET 中也可以实现对回调函数的处理。例如,处理 EnumWindows 函数的回调函数来枚举所有顶级窗口:

Public Class Form1<System.Runtime.InteropServices.DllImport("user32.dll")>Public Shared Function EnumWindows(ByVal lpEnumFunc As EnumWindowsProc, ByVal lParam As Integer) As BooleanEnd Function<System.Runtime.InteropServices.DllImport("user32.dll")>Public Shared Function GetWindowText(ByVal hWnd As IntPtr, ByVal lpString As StringBuilder, ByVal nMaxCount As Integer) As IntegerEnd FunctionPublic Delegate Function EnumWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As Integer) As BooleanPublic Shared Function EnumWindowsCallback(ByVal hWnd As IntPtr, ByVal lParam As Integer) As BooleanDim windowText As New StringBuilder(256)If GetWindowText(hWnd, windowText, 256) > 0 ThenConsole.WriteLine($"窗口句柄:{hWnd},窗口标题:{windowText.ToString()}")End IfReturn TrueEnd FunctionPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickEnumWindows(AddressOf EnumWindowsCallback, 0)End Sub
End Class

在上述示例中,首先声明了 EnumWindows 和 GetWindowText 函数。然后定义了一个委托类型 EnumWindowsProc,该委托与 EnumWindows 函数所需的回调函数签名匹配。接着实现了回调函数 EnumWindowsCallback,在该函数中使用 GetWindowText 函数获取窗口标题并输出。最后在按钮点击事件中调用 EnumWindows 函数并传递回调函数 EnumWindowsCallback,实现了对所有顶级窗口的枚举和信息输出,这种与 Windows API 回调函数的交互能力使得 VB.NET 能够深入参与到 Windows 系统的各种事件和操作处理中,例如开发窗口管理工具、系统监控软件等应用时可以利用这些功能获取系统中各种窗口和进程的详细信息并进行相应处理。

(二)与 Web 服务交互

  1. 调用 Web 服务
    VB.NET 可以方便地调用 Web 服务来获取远程数据或执行远程操作。首先,需要添加 Web 服务引用。在 Visual Studio 中,右键点击项目,选择 “添加服务引用”,在弹出的对话框中输入 Web 服务的 URL,然后点击 “确定”,Visual Studio 会自动生成与该 Web 服务交互的代理类。例如,调用一个简单的天气预报 Web 服务:
Imports WindowsFormsApplication1.ServiceReference1 ' 根据实际服务引用名称修改Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim service As New WeatherServiceClient()Dim result As String = service.GetWeatherForecast("北京")Console.WriteLine(result)service.Close()End Sub
End Class

在上述示例中,假设已经添加了名为 “WeatherService” 的 Web 服务引用,在按钮点击事件中创建了 WeatherServiceClient 实例,调用其 GetWeatherForecast 方法并传入城市名称,获取天气预报信息并输出,最后关闭服务客户端连接。通过调用 Web 服务,VB.NET 应用程序可以整合来自互联网的各种数据和功能,如获取实时新闻、股票行情、地理信息等,极大地扩展了应用程序的功能范围和数据来源,适用于开发具有网络数据交互需求的应用程序,如移动应用的后端服务调用、企业级应用的外部数据整合等。

  1. 创建和发布 Web 服务
    VB.NET 不仅可以调用 Web 服务,还可以创建自己的 Web 服务并发布到网络上供其他应用程序使用。在 Visual Studio 中,创建一个新的 “ASP.NET Web 服务应用程序” 项目,在生成的服务代码文件(通常为 Service.vb)中定义 Web 服务的方法。例如:

在上述示例中,定义了一个名为 MyWebService 的 Web 服务类,它包含两个 WebMethod 标记的方法:AddNumbers 用于将两个整数相加并返回结果,Greet 用于根据传入的名字生成问候语。创建好 Web 服务后,通过在 Visual Studio 中启动项目,即可将 Web 服务发布到本地开发服务器上。此时,其他应用程序就可以通过 Web 服务的 URL(如 http://localhost:端口号/服务名.asmx)添加服务引用并调用这些方法,实现了数据和功能的共享与交互,使得不同平台和语言编写的应用程序能够方便地集成 VB.NET 开发的功能模块,拓展了 VB.NET 应用的使用范围和影响力,在企业级分布式系统开发、跨平台应用集成等场景中具有重要意义。

九、VB.NET 应用程序部署

(一)Windows 应用程序部署

  1. ClickOnce 部署
    ClickOnce 是一种简单方便的 Windows 应用程序部署技术。在 Visual Studio 中,右键点击项目,选择 “发布”,在发布向导中,可以设置应用程序的发布位置(如本地文件夹、网络共享文件夹或 FTP 服务器等)、安装模式(从网络或本地运行)等参数。例如,选择将应用程序发布到本地文件夹后,Visual Studio 会生成一个包含应用程序安装文件和相关清单文件的目录。用户只需双击安装文件(通常为 ..application 文件),即可自动下载并安装应用程序,并且在应用程序有更新时,ClickOnce 可以自动检测并提示用户进行更新,无需用户手动下载和安装新版本,大大简化了应用程序的部署和更新过程,适用于小型到中型规模的 Windows 桌面应用程序部署,尤其是在企业内部网络环境中,方便管理员集中管理和分发应用程序,提高了应用程序的部署效率和用户体验。
  2. Windows Installer 部署
    Windows Installer 是一种更强大、更灵活的部署技术,适用于大型复杂的 Windows 应用程序部署。可以使用 Visual Studio 中的 “Setup Project” 模板来创建 Windows Installer 安装包。在安装项目中,可以添加应用程序的可执行文件、依赖文件、注册表项设置、快捷方式创建等功能。例如,将应用程序的主可执行文件添加到安装项目的 “应用程序文件夹” 中,设置安装程序的用户界面(如欢迎界面、安装进度界面等),指定安装过程中需要创建的注册表项,以便应用程序在系统中正确注册和运行。创建好安装包后,可以将其刻录到光盘、发布到网络共享或通过其他介质进行分发。Windows Installer 提供了丰富的安装选项和自定义功能,如支持条件安装(根据系统配置或用户选择决定是否安装某些组件)、回滚安装(在安装过程中出现错误时可以自动恢复系统到安装前的状态)等,能够满足各种复杂的应用程序部署需求,在企业级软件部署、商业软件发布等场景中广泛应用。

(二)Web 应用程序部署

  1. IIS 部署
    对于 VB.NET 开发的 ASP.NET Web 应用程序,通常部署到 Internet Information Services(IIS)服务器上。首先,需要在服务器上安装 IIS,并确保安装了相应的.NET 框架版本。然后,将 Web 应用程序的文件复制到 IIS 服务器的特定目录(如 C:\inetpub\wwwroot\ 或自定义的虚拟目录)中。在 IIS 管理器中,创建一个新的网站或虚拟目录,并将其指向应用程序文件所在的目录,设置网站的绑定信息(如域名、端口号等)。例如,将一个名为 MyWebApp 的 ASP.NET 应用程序部署到 IIS 上,创建一个名为 MyWebApp 的虚拟目录,绑定到 http://localhost:8080/MyWebApp,并配置相应的应用程序池(确保应用程序池使用的.NET 框架版本与应用程序兼容)。配置完成后,就可以通过浏览器访问该 Web 应用程序,实现了 Web 应用的发布和运行,IIS 提供了稳定高效的 Web 服务托管环境,支持多种身份验证方式、应用程序隔离和性能优化功能,适用于企业级 Web 应用开发和部署,能够满足大量用户并发访问的需求。
  2. Azure 云部署
    除了本地 IIS 部署,还可以将 VB.NET Web 应用程序部署到微软 Azure 云平台上。首先,需要在 Azure 平台上创建一个 Web 应用服务资源。然后,通过 Visual Studio 的 “发布” 功能,选择 “Microsoft Azure App Service” 作为发布目标,登录到 Azure 账号并选择之前创建的 Web 应用服务。Visual Studio 会自动将应用程序文件上传到 Azure 云服务器,并进行相关的配置和部署。Azure 云平台提供了丰富的服务和功能,如自动缩放(根据应用程序的负载自动调整服务器资源)、备份与恢复、监控与诊断等,能够帮助开发者更轻松地管理和运维 Web 应用程序,提高应用程序的可用性和可靠性,同时减少了本地服务器硬件维护和管理的成本和复杂性,适用于需要快速扩展、高可用性和全球部署的 Web 应用场景,如互联网初创公司的应用开发、大型企业的全球化业务拓展等。

十、总结

VB.NET 作为一种功能强大且易于上手的编程语言,在 Windows 应用程序开发、Web 应用开发以及与其他技术集成等方面都有着广泛的应用。从基础的语法学习到面向对象编程、图形用户界面设计、数据访问、异常处理、多线程编程以及与 Windows API 和 Web 服务的交互,再到应用程序的部署,每一个环节都是构建高质量 VB.NET 应用程序的关键。通过深入学习和实践这些内容,开发者能够逐步掌握 VB.NET 的精髓,开发出功能完备、性能优良、用户体验良好的应用程序。无论是开发小型工具软件、企业级应用系统还是 Web 服务,VB.NET 都能提供合适的解决方案和技术支持。随着技术的不断发展,VB.NET 也在持续演进和更新,开发者应保持学习的热情,关注其新特性和技术趋势,不断提升自己的 VB.NET 开发技能,以适应日益变化的软件开发需求,在编程领域创造出更多有价值的作品。

相关文章:

VB.NET 从入门到精通:开启编程进阶之路

摘要&#xff1a; 本文全面深入地阐述了 VB.NET 的学习路径&#xff0c;从基础的环境搭建与语法入门开始&#xff0c;逐步深入到面向对象编程、图形用户界面设计、数据访问、异常处理、多线程编程以及与其他技术的集成等核心领域&#xff0c;通过详细的代码示例与理论讲解&…...

芝法酱学习笔记(1.3)——SpringBoot+mybatis plus+atomikos实现多数据源事务

一、前言 1.1 业务需求 之前我们在讲解注册和登录的时候&#xff0c;有一个重要的技术点忽略了过去。那就是多数据源的事务问题。 按照我们的业务需求&#xff0c;monitor服务可能涉及同时对监控中心数据库和企业中心数据库进行操作&#xff0c;而我们希望这样的操作在一个事…...

图像处理插件:让小程序焕发视觉新生的秘密武器

在小程序开发中&#xff0c;图像处理是一个重要的环节&#xff0c;它涉及到图片的加载、显示、裁剪、压缩等多个方面。为了简化这一复杂过程&#xff0c;开发者通常会使用图像处理插件。这些插件不仅提供了丰富的图像处理功能&#xff0c;还封装了底层的图像操作逻辑&#xff0…...

力扣刷题TOP101: 27.BM34 判断是不是二叉搜索树

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的&#xff1a; 给定一个二叉树根节点&#xff0c;请判断这棵树是不是二叉搜索树。 二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。 思路 什么是二叉搜索树&am…...

Linux图形化工具推荐

1、MobaXterm MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - DownloadFree X server for Windows with tabbed SSH terminal, telnet, RDP, VNC and X11-forwarding - Downloadhttps://mobaxterm.mobatek.net/download.html 2、FinalShell FinalShell SSH工具,服…...

蓝队基础:企业网络安全架构与防御策略

声明 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;此文章为对视频内容稍加整理发布&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他…...

数据结构:栈

什么是栈&#xff1a; 栈是一种特殊的线性表&#xff0c;仅能在线性表的一端操作&#xff0c;栈顶允许操作&#xff0c;栈底不允许操作。 栈的特点是&#xff1a;先进后出&#xff0c;或者说是后进先出&#xff0c;从栈顶放入元素的操作叫入栈&#xff0c;取出元素叫出栈。 栈…...

tcp_recvmsg 函数

tcp_recvmsg 函数是 Linux 内核 TCP 栈的一部分,它主要用于处理从 TCP socket 接收数据的过程。这个函数的主要任务是从 TCP 接收队列中提取数据,并将这些数据拷贝到用户空间提供的缓冲区中。 以下是 tcp_recvmsg 函数的一般工作流程和功能解释: 函数签名和参数 int tcp_re…...

《数据结构》(应用题)

历年真题&#xff08;09~24&#xff09; 2009 最短路径&#xff08;Dijkstra青春版&#xff09; 【2009统考真题】带权图&#xff08;权值非负&#xff0c;表示边连接的两顶点间的距离&#xff09;的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假设从初始顶点…...

阿里内部正式开源“Spring Cloud Alibaba (全彩小册)”

年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;面试的同学们不得不面临着 1 个…...

LeetCode题练习与总结:根据字符出现频率排序--451

一、题目描述 给定一个字符串 s &#xff0c;根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。 返回 已排序的字符串 。如果有多个答案&#xff0c;返回其中任何一个。 示例 1: 输入: s "tree" 输出: "eert" …...

Excel VBA学习系列汇总20241205

整理几年工作中&#xff0c;实用VBA代码&#xff0c;绝对干货&#xff01; 方便自己查询&#xff0c;方便大家学习&#xff0c; 有缘人可复制使用&#xff0c;记得分享给大家免费学习哦&#xff01; 序历史文章1新学期开始&#xff0c;如何新学期开始&#xff0c;如何按成绩名次…...

给el-table表头添加icon图标,以及鼠标移入icon时显示el-tooltip提示内容

在你的代码中&#xff0c;你已经正确地使用了 el-tooltip 组件来实现鼠标划过加号时显示提示信息。el-tooltip 组件的 content 属性设置了提示信息的内容&#xff0c;placement 属性设置了提示信息的位置。 你需要确保 el-tooltip 组件的 content 属性和 placement 属性设置正…...

基于LLM智能问答系统【阿里云:天池比赛】

流程&#xff1a; 1、分别识别问题及提供的资料文件中的公司名实体&#xff0c;有公司名的走语义检索&#xff0c;无公司名的走结构化召回 2、结构化召回&#xff1a;Qwen根据问题生成sql&#xff0c;执行sql获取结果数值&#xff0c;把结果数值与问题给到Qwen生成最终结果 …...

k8s-Informer概要解析(2)

Client-go 主要用在 k8s 控制器中 什么是 k8s Informer Informer 负责与 kubernetes APIServer 进行 Watch 操作&#xff0c;Watch 的资源&#xff0c;可以是 kubernetes 内置资源对象&#xff0c;也可以 CRD。 Informer 是一个带有本地缓存以及索引机制的核心工具包&#x…...

Leetcode 3376. Minimum Time to Break Locks I

Leetcode 3376. Minimum Time to Break Locks I 1. 解题思路2. 代码实现 题目链接&#xff1a;3376. Minimum Time to Break Locks I 1. 解题思路 这一题我最开始的思路走的是贪婪算法的路子&#xff0c;优先走X的增长&#xff0c;不过很不幸失败了&#xff0c;后面还是暴力…...

介绍8款开源网络安全产品

01 HFish蜜罐 HFish是一款开源的蜜罐系统&#xff0c;用于模拟各种网络服务和应用&#xff0c;以吸引潜在的黑客攻击。它能够记录攻击尝试并收集攻击者的信息&#xff0c;从而帮助网络管理员识别潜在的威胁。HFish支持多种协议和服务&#xff0c;包括HTTP、FTP、SSH等&#…...

vue2面试题|[2024-12-5]

开题答辩终于结束了&#xff0c;又要开始我的前端面试学习啦&#xff01;&#xff01;&#xff01; 1.v-model双向绑定原理 class Vue{constructor(options){this.$options optionsthis.$watchEvent {}if(typeof options.beforeCreate function){options.beforeCreate.bind…...

共筑数字安全防线,2024开源和软件安全沙龙即将启幕

随着数字化转型进程的加快以及开源代码的广泛应用&#xff0c;开源凭借平等、开放、协作、共享的优秀创作模式&#xff0c;逐渐成为推动数字技术创新、加速传统行业转型升级的重要模式。但随着软件供应链日趋复杂多元&#xff0c;使得其安全风险不断加剧&#xff0c;针对软件供…...

目标跟踪领域经典论文解析

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…...

SQL DQL数据查询语言(后续)

SQL DQL数据查询语言&#xff08;后续&#xff09; 1.子查询 在查询语句中的WHERE条件子句中&#xff0c;又嵌套了另外一个查询语句在返回列中嵌套一个查询 where条件中嵌套 要求&#xff1a;查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名select a.StudentNo,a…...

Gitee配置SSH公钥

采用SSH协议同步Git仓库代码的好处就是高效。在配置好SSH公钥后&#xff0c;不需要每次操作都要输入用户名和密码&#xff08;主要针对命令行来说&#xff09;。 以我个人项目为例。 生成 SSH 公钥 1. 通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519…...

机器学习——感知机模型

文章目录 前言1.感知机模型介绍1.1基本概念1.2数学表达1.3几何解释1.4优缺点 2.二分类应用2.1应用介绍2.2准备数据集2.2.1环境检查2.2.2数据集介绍2.2.3获取数据2.2.4划分数据集 2.3可视化训练集2.4训练过程2.4.1首轮梯度下降2.4.2多轮梯度下降 2.5可视化分类结果2.6在验证集验…...

如何选择安全、可验证的技术?

澳大利亚信号局的澳大利亚网络安全中心 (ASD 的 ACSC) 发布了一份指导文件&#xff0c;题为《选择安全和可验证的技术》&#xff0c;旨在帮助组织在采购软件&#xff08;专有或开源&#xff09;、硬件&#xff08;例如物联网设备&#xff09;和云服务&#xff08;SaaS、MSP 服务…...

STL库中list的使用与迭代器的实现

STL库中list的使用与迭代器的实现 1.使用list中的部分函数assignspliceremoveuniquemeger 2.list的部分功能实现&#xff08;重点&#xff09;框架迭代器的实现 1.使用list中的部分函数 assign 功能一&#xff1a;当前链表的节点全部销毁&#xff0c;替换成迭代区间的值 功能二…...

android 常用三方框架

说实话&#xff0c; 我是比较讨厌三方框架的&#xff0c; 比如一个eventbus 底层逻辑就是个观察者模式&#xff0c;当然他的场景涵盖的比较丰富&#xff0c; 单从 单一原则来说&#xff0c; 还是一个简单的观察者模式就能解决问题&#xff0c; 何必要添加那么多文件到我们的项目…...

Browser.js断点续传上传

通过断点续传上传的方式将文件上传到OSS前&#xff0c;您可以指定断点记录点。上传过程中&#xff0c;如果出现网络异常或程序崩溃导致文件上传失败时&#xff0c;将从断点记录处继续上传未上传完成的部分。 attention&#xff1a; 1、 当您使用webpack或browserify等打包工具…...

Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;租房市场日益繁荣&a…...

了解Cocoa Touch框架与主要组件

Cocoa Touch框架详解及其主要组件 一、Cocoa Touch框架概述 Cocoa Touch框架是苹果公司为iOS应用程序开发提供的一套完整的框架&#xff0c;它基于Cocoa框架&#xff0c;并专为触控设备如iPhone、iPad等设计。这套框架不仅包含了构建图形用户界面&#xff08;GUI&#xff09;…...

ISO45001职业健康安全管理体系涵盖了丰富的内容

范围与术语 适用范围&#xff1a;明确规定了该标准适用于任何有愿望建立、实施和保持职业健康安全管理体系的组织&#xff0c;旨在使组织能够通过管理体系的有效运行&#xff0c;预防和控制职业健康安全风险&#xff0c;持续改进职业健康安全绩效。术语定义&#xff1a;对职业…...

Spring Boot 整合 Druid 并开启监控

文章目录 1. 引言2. 添加依赖3. 配置数据源4. 开启监控功能5. 自定义 Druid 配置&#xff08;可选&#xff09;6. 访问监控页面7. 注意事项8. 总结 Druid 是一个由阿里巴巴开源的高性能数据库连接池&#xff0c;它不仅提供了高效的连接管理功能&#xff0c;还自带了强大的监控和…...

【JAVA高级篇教学】第一篇:Springboot对接通义千问大模型

博主今天打算讲解下Java如何对接阿里云的通义千问大模型&#xff0c;可以自己玩玩ai问答之类的&#xff01; 目录 一、发展历程 二、API-KEY的获取与配置 三、引用SDK 四、文本模型 1.代码 2.返回数据 3.官方代码案例 五、通义千问VL 1.计量计费 六、查看API-KEY调用额…...

【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】

卸载 MySQL 参考文章&#xff1a; 完美解决Mysql彻底删除并重装_怎么找到mysql并卸载-CSDN博客使用命令卸载mysql_卸载mysql服务命令-CSDN博客 先管理员方式打开 cmd &#xff0c;切换到 MySQL 安装目录的 bin 文件夹下&#xff0c;执行如下命令&#xff0c;删除 MySQL 服务 my…...

Next.js 系统性教学:深入理解缓存与数据优化策略

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 前言 1. 缓存的基本概念 1.1 缓存的作用 1.2 Next.js 中的缓存策略 2. Next.js 的缓存机制 2.1 请求记忆化&#xff08;Request Memoization&#xff09; 2.1.1 什…...

JAVA数据结构

1.数组 (Array): 固定大小的容器,用于存储相同类型的元素,数组在内存中是连续存储的,支持通过索引快 速访问元素。 int[] numbers = new int[10]; numbers[0] = 1;2.Java Collections Framework (JCF) JCF提供了一组接口和类用于管理和操作集合(如列表,集合,…...

力扣第96题 不同的二叉搜索树

力扣第96题 - 不同的二叉搜索树 题目描述 给定一个整数 n&#xff0c;求以 1 到 n 为节点组成的所有 不同的二叉搜索树&#xff08;BST&#xff09; 的个数。 题目分析 二叉搜索树的性质 对于一个二叉搜索树&#xff0c;以 i 为根节点&#xff1a; 左子树的节点值来自 [1, i…...

在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!

你好&#xff0c;年轻的学徒&#xff01;&#x1f9d1;‍&#x1f4bb; 是时候踏上进入Java开发世界的史诗之旅了&#xff0c;我们的得力助手将是强大的IntelliJ IDEA。准备好了吗&#xff1f;出发吧&#xff01; 在我们开始之前&#xff0c;我们需要下载这个工具。但是&#…...

【C语言】18. 自定义类型:结构体类型

文章目录 前言&#xff1a;一、结构体类型的声明1、结构体回顾1&#xff09;结构的声明2&#xff09;结构体变量的创建和初始化 2、结构的特殊声明3、结构的⾃引⽤ 二、结构体变量的创建和初始化1、对⻬规则2、为什么存在内存对⻬?3、修改默认对⻬数 三、结构成员访问操作符1、…...

智能租赁管理系统助力规范化住房租赁市场提升用户体验

内容概要 在当今的住房租赁市场中&#xff0c;智能租赁管理系统应运而生&#xff0c;为房东和租客带来了前所未有的便利。这套系统就像一位全能助手&#xff0c;将租赁信息、监管机制以及在线签约功能集成在一起&#xff0c;让整个过程变得流畅而高效。换句话说&#xff0c;您…...

ERROR: KeeperErrorCode = NoNode for /hbase/master

原因分析 通过上面的情景模拟&#xff0c;我们可以看到报错的原因在于zookeeper中出现问题&#xff0c;可能是zookeeper中的/hbase/master被删除&#xff0c;或者是在hbase集群启动之后重新安装了zookeeper&#xff0c;导致zookeeper中的/hbase/master节点数据异常。 1. 停止…...

springboot第84集:Java进阶之路, Netty

# kafka-map文件夹 cd /usr/local/kafka-map # 根据需求自行修改配置 vi application.yml # 启动 java -jar kafka-map.jar byte minByte -128; byte maxByte 127; 用于表示一个 8 位&#xff08;1 字节&#xff09;有符号整数。它的值范围是 -128&#xff08;-2^7&#xff0…...

DevOps持续集成

DevOps流程 第一步安装git 关闭防火墙 systemctl stop firewalld cd /usr/loacl vim docker-compose.yml docker search gitlab 拉取gitlab镜像 2.33GB docker pull gitlab/gitlab-ce:latestvim docker-compose.yml修改docker-compose.yml version: 3.1 services:gitlab:i…...

sql server log文件

确定 SQL Server 实例中具有大量 VDF 的数据库 SELECT [name], COUNT(l.database_id) AS vlf_count FROM sys.databases AS s CROSS APPLY sys.dm_db_log_info(s.database_id) AS l GROUP BY [name] HAVING COUNT(l.database_id) > 100; 在收缩日志文件之前确定事务日志中…...

pip install报错 Missing dependencies for SOCKS support的正确解决办法:离线安装pysocks

今天准备开发python项目的时候&#xff0c;发现在pip install 的时候报错了&#xff0c;提示&#xff1a;Missing dependencies for SOCKS support&#xff0c;查遍csdn所有的回答都统一是只需要执行&#xff1a; unset all_proxy unset ALL_PROXY 然后再执行 pip install p…...

嵌入式学习(15)-stm32通用GPIO模拟串口发送数据

一、概述 在项目开发中可能会遇到串口不够用的情况这时候可以用通过GPIO来模拟串口的通信方式。 二、协议格式 按照1位起始位8位数据位1位停止位的方式去编写发送端的程序。起始位拉低一个波特率的时间&#xff1b;发送8位数据&#xff1b;拉高一个波特率的时间。 三、代码 …...

AKE 安全模型:CK, CK+, eCK

参考文献&#xff1a; [BCK98] Mihir Bellare, Ran Canetti, Hugo Krawczyk. A Modular Approach to the Design and Analysis of Authentication and Key Exchange Protocols (Extended Abstract). STOC 1998: 419-428.[CK01] Ran Canetti, Hugo Krawczyk. Analysis of Key-E…...

【Linux】通过crond服务设置定时执行shell脚本,实际执行时间却延迟了8小时

一、问题描述 通过使用crond服务设置定时任务&#xff0c;在每天凌晨的2:00执行脚本&#xff0c;但检查结果时发现&#xff0c;实际执行时间却在上午10点。 检查shell脚本执行结果发现&#xff0c;实际执行脚本时间在上午10:00&#xff0c;延迟了8小时。 检查系统时间&#xf…...

什么是云原生数据库 PolarDB?

云原生数据库 PolarDB 是阿里云推出的一款高性能、兼容性强、弹性灵活的关系型数据库产品。它基于云原生架构设计&#xff0c;结合分布式存储和计算分离的技术优势&#xff0c;为用户提供强大的计算能力、卓越的可靠性以及高性价比的数据库解决方案。PolarDB 适合各种业务场景&…...

(6)JS-Clipper2之ClipperOffset

1. 描述 ClipperOffset类封装了对打开路径和关闭路径进行偏移(膨胀/收缩)的过程。 这个类取代了现在已弃用的OffsetPaths函数&#xff0c;该函数不太灵活。可以使用不同的偏移量(增量)多次调用Execute方法&#xff0c;而不必重新分配路径。现在可以在一次操作中对开放和封闭路…...

基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0095 1. 主要功能&#xff1a; 基于51单片机的病床呼叫系统proteus仿…...