====== 代码抽离 (Code Extraction) ======
**核心概念**:
随着程序功能的增加,如果所有代码都写在 `Program.cs` 或同一个文件中,代码会变得非常臃肿、难以维护。
**代码抽离**就是将不同功能的代码提取出来,放入单独的类(Class)或单独的项目(类库 DLL)中。
===== 创建一个次类 =====
在同一个项目中,我们可以通过添加新的类文件来分离代码。
**操作步骤:**
- 在“解决方案资源管理器”中,右键点击项目名称(例如 `HelloWorldCS`)。
- 选择 **添加 (Add)** -> **类 (Class)**。
- 输入类名(例如 `InfoDisplay.cs`),点击确定。
using System;
namespace CodeExtraction
{
// 定义一个次类 (Sub-class)
// 注意:类必须是 public 的,才能被其他地方访问
public class InfoDisplay
{
// 定义一个方法
// 3个参数的示例方法
public void Show_MAX_Pipou(string a1, string a2, string a3)
{
Console.WriteLine("参数1: " + a1);
Console.WriteLine("参数2: " + a2);
Console.WriteLine("参数3: " + a3);
}
}
}
===== 主类中调用次类 =====
在主程序(`Program.cs`)中,要使用上面创建的类,通常需要**实例化**(创建对象)。
**关键点:**
* 必须确保主类和次类在同一个命名空间下,或者使用 `using` 引用了次类的命名空间。
* 使用 `new` 关键字创建对象。
using System;
namespace CodeExtraction
{
class Program
{
static void Main(string[] args)
{
string a1 = "23", a2 = "25", a3 = "27";
// 1. 实例化对象 (创建一个英雄叫雷神)
// 语法:类名 变量名 = new 类名();
InfoDisplay LeiShen = new InfoDisplay();
// 2. 调用次类中的方法
LeiShen.Show_MAX_Pipou(a1, a2, a3);
Console.ReadKey();
}
}
}
===== 主类中直接使用次类变量 (Static) =====
如果次类中的变量或方法被 `static` (静态) 关键字修饰,则在主类中**无需实例化**,可以直接通过**类名**点出来使用。
**次类修改:**
public class InfoDisplay
{
// 定义一个静态变量
// static 意味着这个变量属于“类”本身,而不是某个“对象”
public static int num;
// 中间缓存 (非静态变量可以使用静态变量)
int num1 = num;
// ... 其他方法
}
**主类调用:**
class Program
{
static void Main(string[] args)
{
// 直接使用子类的变量,无需 new InfoDisplay()
InfoDisplay.num = 1000;
Console.WriteLine("静态变量值: " + InfoDisplay.num);
}
}
===== 文件 [程序打包引用] =====
**概念类比**:
DLL (Dynamic Link Library) 文件类似于 PLC 编程中的 **FB块 (功能块)** 封装。
* 你将一段逻辑写好、封装起来。
* 导出成一个文件 (.dll)。
* 其他程序导入这个文件,就可以直接使用里面的功能,而不需要知道里面的源代码。
**注意:** DLL 文件本质就是**类库**文件。
在编写类库时,**类 (class)** 和 **字段/方法** 前面必须加 `public`,否则外部程序无法访问。
==== 创建类库文件及程序 ====
**操作步骤:**
- 打开 Visual Studio,新建项目。
- 选择 **类库 (.NET Core)** 或 **类库 (.NET Framework)** (Class Library)。
- 命名项目(例如 `DllTestDemo`)。
==== 100-4-2:编译生成 DLL 文件 ====
编写好类库代码后,需要编译生成 `.dll` 文件。
**类库代码示例 (Class1.cs):**
using System;
namespace DllTestDemo // 保持命名空间与项目名一致,方便识别
{
public class Class1
{
// 一个计算方法示例
public int Jishuan(int a, int b, int g)
{
return a + b + g;
}
}
}
**生成步骤:**
- 在顶部菜单栏点击 **生成 (Build)** -> **生成解决方案 (Build Solution)**。
- 成功后,进入项目文件夹:`bin` -> `Debug` -> `netcoreappX.X` (或 netframework)。
- 找到生成的 **`DllTestDemo.dll`** 文件。
==== 主程序添加引用 DLL 文件 ====
如果一个项目使用了 DLL 文件,单独把生成的 `.exe` 放到桌面是不能运行的,必须把 `.dll` 和 `.exe` 放在一起。
**引用步骤:**
- 打开你的**主程序**项目(控制台应用程序)。
- 在“解决方案资源管理器”中,右键点击 **依赖项 (Dependencies)** 或 **引用 (References)**。
- 选择 **添加引用 (Add Reference)** -> **浏览 (Browse)**。
- 找到刚才生成的 `DllTestDemo.dll` 文件并添加。
**主程序代码调用:**
using System;
// 这里的命名空间通常与你的主程序一致
namespace TestDllUsage
{
class Program
{
static void Main(string[] args)
{
// 使用 DLL 文件名(命名空间) + 类名 来实例化对象
// 这里的 DllTestDemo 是 DLL 项目的命名空间
DllTestDemo.Class1 DD = new DllTestDemo.Class1();
int a = 5, b = 3, g = 5;
// 调用 DLL 中的方法
int kar = DD.Jishuan(a, b, g);
Console.WriteLine("计算结果: " + kar);
Console.ReadKey();
}
}
}