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;
            }
        }
    }
}
相关推荐
z200509302 小时前
【linux学习】linux工具篇(下)
linux·学习
星夜夏空992 小时前
STM32单片机学习(17) —— 串口外设中断
stm32·单片机·学习
魔法阵维护师2 小时前
从零开发游戏需要学习的c#模块,第二十一章(精灵动画 —— 让角色走起来)
学习·游戏·c#
Eiceblue2 小时前
使用 C# 高效替换 PDF 中的文本:全页、区域与正则匹配
visualstudio·pdf·c#
郝学胜-神的一滴2 小时前
Qt 高级开发 011: 跨线程信号槽实战
开发语言·c++·qt·程序人生·开源软件·用户界面
轻刀快马2 小时前
讲透分布式系统的演进史与核心架构
开发语言·架构·php
学困昇2 小时前
Linux 动静态库制作与原理:从 .a、.so 到 ELF 加载一次讲透
linux·运维·服务器·c语言·开发语言·c++·人工智能
xian_wwq2 小时前
【学习笔记】探讨大模型应用安全建设系列6——合规备案:大模型备案与监管合规实操
笔记·学习·安全
kels88992 小时前
加密货币实时api的订单簿快照多久更新一次?
开发语言·笔记·python·金融·区块链