C# Windows Forms 学生成绩管理器(StudentGradeManager)—— 方法重载、out、ref、params 参数示例

C# Windows Forms 学生成绩管理器(StudentGradeManager)------ 方法重载、out、ref、params 参数示例

1. 项目简介

这是一个基于 C# Windows Forms 的简单学生成绩管理演示程序,项目名称为 StudentGradeManager。它主要用于展示 C# 中几个重要的语言特性:

  • 泛型集合(List<T>Dictionary<TKey, TValue>)的使用
  • 方法重载(Overload)
  • out 参数(用于从方法中返回多个值)
  • params 参数(可变数量参数)
  • ref 参数(引用传递)

程序界面简洁,通过几个分组框分别演示了上述功能,非常适合初学者理解这些概念的实际应用。

2. 项目框架

2.1 窗体设计

窗体主要包含以下控件:

  • 两个 ListBox :左侧显示学生姓名(lstNames),右侧显示姓名+成绩(lstScores)。
  • 两个按钮:"打印选中学生"(演示重载1)、"打印所有成绩"(演示重载2)。
  • 三个分组框(GroupBox)
    • out 参数查找成绩 :输入姓名,点击"查找"按钮,通过 out 参数返回成绩并显示。
    • params 参数计算平均分 :输入逗号分隔的整数,点击"计算"按钮,使用 params 数组计算平均值。
    • ref 参数交换数字 :输入两个整数,点击"交换"按钮,通过 ref 参数交换两数的值。
  • 一个重置按钮:将所有数据恢复为初始状态。

2.2 数据存储

在代码中使用以下两个集合存储数据:

csharp 复制代码
private List<string> studentNames;               // 学生姓名列表
private Dictionary<string, int> studentScores;   // 姓名 -> 成绩映射

初始化数据:

csharp 复制代码
private void InitializeData()
{
    studentNames = new List<string> { "张三", "李四", "王五" };
    studentScores = new Dictionary<string, int>
    {
        { "张三", 85 },
        { "李四", 92 },
        { "王五", 78 }
    };
}

每次刷新界面时,将集合内容显示到两个 ListBox 中。

3. 核心代码解析

3.1 方法重载(Overload)

方法重载允许在同一类中定义多个同名方法,但参数列表不同。本项目中演示了两种重载形式:

csharp 复制代码
// 重载1:打印单个学生信息(消息框)
private void PrintStudent(string name, int score)
{
    MessageBox.Show($"单个学生:{name},成绩:{score}", "方法重载演示");
}

// 重载2:打印整个成绩表(消息框)
private void PrintStudent(Dictionary<string, int> scores)
{
    string msg = "所有学生成绩:\n";
    foreach (var kv in scores)
        msg += $"{kv.Key}: {kv.Value}\n";
    MessageBox.Show(msg, "方法重载演示");
}

通过点击不同按钮调用不同版本的重载方法。

3.2 out 参数

out 参数用于从方法中返回额外的值。下面的 TryGetScore 方法尝试根据姓名查找成绩,如果找到则返回 true 并通过 out 参数传出成绩,否则返回 false

csharp 复制代码
private bool TryGetScore(string name, out int score)
{
    return studentScores.TryGetValue(name, out score);
}

调用时:

csharp 复制代码
if (TryGetScore(name, out int score))
    lblResult.Text = $"{name} 的成绩是:{score}";
else
    lblResult.Text = $"未找到学生:{name}";

3.3 params 参数

params 关键字允许方法接收可变数量的参数,这些参数会被自动转换为数组。本例中 Average 方法计算任意多个整数的平均值:

csharp 复制代码
private double Average(params int[] numbers)
{
    if (numbers == null || numbers.Length == 0)
        return 0;
    return numbers.Average(); // 使用 LINQ 简化
}

在按钮点击事件中,将用户输入的逗号分隔字符串解析为整数数组,然后调用 Average 方法。

3.4 ref 参数

ref 参数使得参数按引用传递,方法内对参数的修改会反映到原始变量中。经典的交换示例:

csharp 复制代码
private void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

调用前需要初始化变量,并使用 ref 关键字:

csharp 复制代码
Swap(ref a, ref b);

界面中通过两个文本框输入数字,点击交换后显示交换前后的值。

3.5 重置功能

重置按钮将所有控件清空,并重新调用 InitializeData()RefreshDisplay(),恢复初始数据状态。

4. 运行界面预览

程序主界面包含四个主要区域:

  • 顶部:两个 ListBox 分别显示学生名单和成绩。
  • 中部 :三个分组框,分别演示 outparamsref 参数的使用。
  • 底部:重置按钮,方便多次测试。

5. 完整源码下载

为了方便大家学习,我将完整源码整理成了压缩包,包含两个文件:

  • Form1.cs(逻辑代码)
  • Form1.Designer.cs(设计器代码)

下载地址

我的主页有下载资源

你也可以直接在 Visual Studio 中新建一个 Windows Forms 应用,将以下两个文件的代码复制进去即可运行。

附:关键代码片段(Form1.cs)

csharp 复制代码
// 方法重载演示
private void PrintStudent(string name, int score) { ... }
private void PrintStudent(Dictionary<string, int> scores) { ... }

// out 参数演示
private bool TryGetScore(string name, out int score) { ... }

// params 参数演示
private double Average(params int[] numbers) { ... }

// ref 参数演示
private void Swap(ref int a, ref int b) { ... }

6. 总结

通过这个简单的学生成绩管理器,我们实践了 C# 中几个重要的语法特性。这些特性在实际开发中非常实用,例如:

  • 方法重载:让 API 更灵活易用。
  • out 参数 :常用于 TryParse 模式(如 int.TryParse)。
  • params 参数 :简化可变参数方法的调用(如 string.Format)。
  • ref 参数:需要修改调用方变量时使用(但需谨慎)。

希望这个小示例能帮助你更好地理解这些概念。如果你有任何问题或改进建议,欢迎留言交流!


本文原创,转载请注明出处。

相关推荐
千百元1 小时前
网络图标显示不正常
开发语言·网络·php
Amumu121382 小时前
Js: ES新特性(一)
开发语言·前端·javascript
cm6543202 小时前
C++中的原型模式变体
开发语言·c++·算法
除了辣条不吃辣2 小时前
ABAP 正则表达式
开发语言·正则表达式·abap·alv
wuqingshun3141592 小时前
谈一下Daemon线程
java·开发语言
☆5662 小时前
C++中的策略模式进阶
开发语言·c++·算法
Yupureki2 小时前
《Linux系统编程》14.库的制作与原理
linux·运维·服务器·c语言·开发语言·c++
人间打气筒(Ada)2 小时前
go实战案例:如何基于 Conul 给微服务添加服务注册与发现?
开发语言·微服务·zookeeper·golang·kubernetes·etcd·consul
2301_822782822 小时前
嵌入式C++调试技术
开发语言·c++·算法