C# 学习 Day1

Day1 目标(6-8小时)

  • 掌握 C# 面试高频语法与 OOP 核心
  • 能写一个"学生管理系统(控制台版)"
  • 能回答 10 个基础面试问题

第一部分:30分钟速通(只讲会考的)

1) 基础类型与可空

  • 值类型:int, double, bool, struct, enum
  • 引用类型:string, class, array, object
  • 可空值类型:int? age = null;
  • 可空引用(C# 8+):string? name = null;

2) vardynamicobject 区别

  • var:编译期推断,类型一旦确定不可变
  • object:所有类型基类,调用成员前要转换
  • dynamic:运行期绑定,灵活但更易出错(面试喜欢问风险)

3) 面向对象四件套

  • 封装:字段私有 + 属性公开
  • 继承:class Dog : Animal
  • 多态:virtual/override 或接口实现
  • 抽象:abstract class + abstract method

4) 接口 vs 抽象类

  • 接口:行为规范("能做什么")
  • 抽象类:模板与共性实现("是什么"+部分实现)

5) 异常处理

  • try-catch-finally
  • 不要吞异常;要保留上下文(真实项目很重要)

6) 集合(高频)

  • List<T>:顺序、可重复
  • Dictionary<TKey, TValue>:键值查找快
  • HashSet<T>:去重

第二部分:手写3题(先自己写,再看参考)

题1:找数组最大值与最小值

输入 int[] nums = { 3, 9, -1, 6, 0 },输出 max/min。

cs 复制代码
int[] nums = { 3, 9, -1, 6, 0 };

int max = nums[0], min = nums[0];

for (int i = 1; i < nums.Length; i++)

{

if (nums[i] > max) max = nums[i];

if (nums[i] < min) min = nums[i];

}

Console.WriteLine($"max={max}, min={min}");

题2:统计字符串中每个字符出现次数

"abcaab" 输出 a:3 b:2 c:1

cs 复制代码
string s = "abcaab";

var dict = new Dictionary<char, int>();

foreach (var ch in s)

{

if (!dict.ContainsKey(ch)) dict[ch] = 0;

dict[ch]++;

}

foreach (var kv in dict)

{

Console.WriteLine($"{kv.Key}:{kv.Value}");

}

题3:定义一个 Person,支持多态打印信息

要求:基类 Person,子类 Student 重写方法。

cs 复制代码
public class Person

{

public string Name { get; set; } = "";

public virtual void PrintInfo()

{

Console.WriteLine($"Person: {Name}");

}

}

public class Student : Person

{

public int Grade { get; set; }

public override void PrintInfo()

{

Console.WriteLine($"Student: {Name}, Grade: {Grade}");

}

}

第三部分:今日小项目(必须做)

做一个控制台 StudentManager,功能:

  • 新增学生(Id, Name, Age)
  • 查询全部学生
  • 按 Id 删除学生
  • 按 Name 模糊搜索
  • 输入 0 退出

项目要求(面试加分点)

  • List<Student> 存数据
  • 拆分成类:StudentStudentServiceProgram
  • 有基本异常处理(如输入数字失败)

第四部分:今天必背10问(面试话术版)

  1. 值类型和引用类型区别?

    值类型存储实际值,引用类型存储对象地址;值类型通常在栈上,引用类型对象通常在堆上。

  2. string 是值类型还是引用类型?

    引用类型,但有不可变特性。

  3. var 是动态类型吗?

    不是,var 是编译期类型推断。

  4. refout 区别?
    ref 传入前必须初始化;out 不要求,但方法内部必须赋值。

  5. 重载和重写区别?

    重载同名不同参数(编译期);重写是子类改父类虚方法(运行期多态)。

  6. 接口和抽象类什么时候用?

    接口定义能力,抽象类抽公共实现;多继承能力靠接口。

  7. try-catch-finally 中 finally 一定执行吗?

    基本会执行,除非进程崩溃或强制终止。

  8. ListDictionary 怎么选?

    顺序遍历用 List;按键高效查找用 Dictionary

  9. 什么是封装?

    隐藏内部细节,对外暴露稳定接口,降低耦合。

  10. 什么是多态?

    同一调用入口在不同对象上表现不同行为(如 override)。


你现在要交付的作业(按顺序)

  • 完成上面3道手写题
  • 完成 StudentManager 小项目
  • 把你的代码贴给我(至少贴 StudentServiceProgram

作业代码

cs 复制代码
public class Student
{
    // 学号
    public int Id { get; set; }

    // 姓名
    public string Name { get; set; }

    // 年龄
    public int Age { get; set; }
}
cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;

public class StudentService
{
    // 使用 List 存储学生
    private List<Student> students = new List<Student>();

    // 新增学生
    public void AddStudent()
    {
        try
        {
            Console.Write("请输入学生ID:");
            int id = Convert.ToInt32(Console.ReadLine());

            Console.Write("请输入学生姓名:");
            string name = Console.ReadLine();

            Console.Write("请输入学生年龄:");
            int age = Convert.ToInt32(Console.ReadLine());

            Student stu = new Student
            {
                Id = id,
                Name = name,
                Age = age
            };

            students.Add(stu);

            Console.WriteLine("添加成功!");
        }
        catch (Exception)
        {
            Console.WriteLine("输入格式错误!");
        }
    }

    // 查询全部学生
    public void ShowAllStudents()
    {
        if (students.Count == 0)
        {
            Console.WriteLine("暂无学生数据!");
            return;
        }

        Console.WriteLine("====== 学生列表 ======");

        foreach (Student stu in students)
        {
            Console.WriteLine($"ID:{stu.Id} 姓名:{stu.Name} 年龄:{stu.Age}");
        }
    }

    // 删除学生
    public void DeleteStudentById()
    {
        try
        {
            Console.Write("请输入要删除的ID:");
            int id = Convert.ToInt32(Console.ReadLine());

            Student stu = students.Find(s => s.Id == id);

            if (stu != null)
            {
                students.Remove(stu);
                Console.WriteLine("删除成功!");
            }
            else
            {
                Console.WriteLine("未找到该学生!");
            }
        }
        catch (Exception)
        {
            Console.WriteLine("输入错误!");
        }
    }

    // 模糊搜索
    public void SearchByName()
    {
        Console.Write("请输入姓名关键字:");
        string keyword = Console.ReadLine();

        List<Student> result = students.FindAll(
            s => s.Name.Contains(keyword)
        );

        if (result.Count == 0)
        {
            Console.WriteLine("未找到学生!");
            return;
        }

        Console.WriteLine("====== 搜索结果 ======");

        foreach (Student stu in result)
        {
            Console.WriteLine($"ID:{stu.Id} 姓名:{stu.Name} 年龄:{stu.Age}");
        }
    }
}
cs 复制代码
using System;

class Program
{
    static void Main(string[] args)
    {
        StudentService service = new StudentService();

        while (true)
        {
            Console.WriteLine();
            Console.WriteLine("====== 学生管理系统 ======");
            Console.WriteLine("1. 新增学生");
            Console.WriteLine("2. 查看全部学生");
            Console.WriteLine("3. 删除学生");
            Console.WriteLine("4. 按姓名搜索");
            Console.WriteLine("0. 退出");
            Console.Write("请选择功能:");

            string choice = Console.ReadLine();

            switch (choice)
            {
                case "1":
                    service.AddStudent();
                    break;

                case "2":
                    service.ShowAllStudents();
                    break;

                case "3":
                    service.DeleteStudentById();
                    break;

                case "4":
                    service.SearchByName();
                    break;

                case "0":
                    Console.WriteLine("程序退出!");
                    return;

                default:
                    Console.WriteLine("输入错误,请重新输入!");
                    break;
            }
        }
    }
}
相关推荐
Scott9999HH41 分钟前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
EIP低代码平台1 小时前
EIP 低代码平台 - 角色维护
低代码·c#·权限·工作流·netcore
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨3 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a1117765 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao5 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
人邮异步社区5 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf