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

C#基础编程核心知识点总结

一、C# 基础编程

1. 数据类型
  • 值类型:直接存储数据值,存储在栈中。 示例:int a = 10;(整数)、bool flag = true;(布尔)、char c = 'A';(字符)、struct Point { public int X; public int Y; }(结构体)。

  • 引用类型:存储数据的引用(地址),数据本身在堆中。 示例:string str = "hello";(字符串)、object obj = new object();(对象)、int[] arr = new int[5];(数组)、List<int> list = new List<int>();(集合)。

  • 指针类型:存储内存地址,需在unsafe上下文使用(多用于底层操作)。 示例:

    unsafe {int a = 10;int* p = &a; // 指针p指向a的地址Console.WriteLine(*p); // 输出10
    }
  • 可空类型:允许值类型接收null,语法为类型?(本质是Nullable<T>结构体)。 示例:int? age = null;(整数可空)、bool? isMarried = null;(布尔可空)。 注意:通过HasValue判断是否有值,Value获取值(如if(age.HasValue) Console.WriteLine(age.Value);)。

2. 语句
  • 控制语句

    • if-else

      int score = 85;
      if (score >= 90) Console.WriteLine("优秀");
      else if (score >= 60) Console.WriteLine("及格");
      else Console.WriteLine("不及格");
    • switch-case

      char grade = 'B';
      switch (grade) {case 'A': Console.WriteLine("90-100"); break;case 'B': Console.WriteLine("80-89"); break;default: Console.WriteLine("其他"); break;
      }
    • 循环语句

      • for:for (int i = 0; i < 5; i++) Console.WriteLine(i);

      • while:int j = 0; while (j < 5) { Console.WriteLine(j); j++; }

      • do-while:int k = 0; do { Console.WriteLine(k); k++; } while (k < 5);

    • 跳转语句

      • continue(跳过本次循环):for (int i = 0; i < 5; i++) { if (i == 2) continue; Console.WriteLine(i); }(不输出 2)

      • break(退出循环):for (int i = 0; i < 5; i++) { if (i == 2) break; Console.WriteLine(i); }(只输出 0,1)

      • goto(跳转到标签):goto End; ... End: Console.WriteLine("结束");(慎用,易破坏逻辑)

  • 异常捕获语句(try-catch-finally)

    try {int result = 10 / 0; // 引发除零异常
    } catch (DivideByZeroException ex) {Console.WriteLine("错误:" + ex.Message); // 捕获特定异常
    } catch (Exception ex) {Console.WriteLine("其他错误:" + ex.Message); // 捕获所有异常(父类)
    } finally {Console.WriteLine("无论是否异常,都会执行"); // 释放资源等操作
    }
  • using 语句:自动释放实现IDisposable接口的资源(如文件流、数据库连接)。

    // 自动调用StreamWriter的Dispose()释放资源
    using (StreamWriter sw = new StreamWriter("test.txt")) {sw.WriteLine("Hello World");
    }
3. 容器
  • 数组

    • 一维数组:int[] nums = {1, 2, 3};(长度固定)

    • 多维数组(矩形数组):int[,] matrix = { {1,2}, {3,4} };(matrix[0,1] = 2)

    • 交错数组(数组的数组):int[][] jagged = new int[2][]; jagged[0] = new int[] {1,2}; jagged[1] = new int[] {3};(每行长度可不同)

  • 集合

    • 单列集合(List<T>)

      :动态数组,支持增删改查。

      List<string> names = new List<string>();
      names.Add("张三"); // 添加
      names[0] = "李四"; // 修改
      names.RemoveAt(0); // 删除索引0的元素
      foreach (var name in names) Console.WriteLine(name); // 遍历
    • 双列集合(Dictionary<K,V>)

      :键值对存储,通过键快速访问值。

      Dictionary<int, string> idToName = new Dictionary<int, string>();
      idToName.Add(1, "张三"); // 添加
      Console.WriteLine(idToName[1]); // 访问(输出"张三")
      idToName.Remove(1); // 删除
    • 集合运算

      List<int> a = new List<int> {1, 2, 3};
      List<int> b = new List<int> {3, 4, 5};
      var union = a.Union(b).ToList(); // 并集:{1,2,3,4,5}
      var intersect = a.Intersect(b).ToList(); // 交集:{3}
4. 面向对象编程(OOP)
  • 类与对象:类是模板,对象是类的实例。

    class Person { // 类// 字段(成员变量)public string name;private int age;// 属性(封装字段,控制访问)public int Age {get { return age; }set { if (value > 0) age = value; } // 验证逻辑}// 构造方法(初始化对象)public Person(string name, int age) {this.name = name;this.Age = age; // 调用属性的setter}// 实例方法(需通过对象调用)public void SayHello() {Console.WriteLine($"我是{name},年龄{Age}");}// 静态方法(通过类名调用,无this)public static void PrintType() {Console.WriteLine("这是Person类");}
    }
    ​
    // 使用:创建对象
    Person p = new Person("张三", 20);
    p.SayHello(); // 实例方法调用
    Person.PrintType(); // 静态方法调用
  • 方法递归:方法自身调用(解决如阶乘、斐波那契等问题)。

    // 计算n的阶乘
    int Factorial(int n) {if (n == 1) return 1; // 终止条件return n * Factorial(n - 1); // 递归调用
    }
  • 三大特性

    • 封装:通过访问修饰符(public/private 等)隐藏内部实现,暴露必要接口(如上述Person类的Age属性)。

    • 继承

      :子类继承父类的成员,实现代码复用。

      class Student : Person { // 继承Personpublic string School { get; set; }// 重写父类方法(需父类方法为virtual)public override void SayHello() {Console.WriteLine($"我是{name},在{School}上学");}
      }
    • 多态

      :同一操作作用于不同对象产生不同结果(通过虚方法 + 重写实现)。

      Person s = new Student("李四", 18); // 父类引用指向子类对象
      s.SayHello(); // 调用子类重写的方法,输出"我是李四,在...上学"
  • 特殊类 / 接口

    • 抽象类(abstract)

      :不能实例化,可包含抽象方法(需子类实现)。

      abstract class Shape {public abstract double GetArea(); // 抽象方法(无实现)
      }
      class Circle : Shape {public double Radius { get; set; }public override double GetArea() { return Math.PI * Radius * Radius; }
      }
    • 部分类(partial)

      :将类拆分到多个文件,编译时合并

      // File1.cs
      partial class MyClass { public void Method1() {} }
      // File2.cs
      partial class MyClass { public void Method2() {} }
    • 密封类(sealed):不能被继承。 sealed class FinalClass { }

    • 接口(interface)

      :纯抽象成员(方法、属性等),类可实现多个接口。

      interface IFly { void Fly(); }
      interface ISwim { void Swim(); }
      class Duck : IFly, ISwim {public void Fly() { Console.WriteLine("鸭子飞"); }public void Swim() { Console.WriteLine("鸭子游"); }
      }
5. API 操作
  • IO 流(文件读写)

    • File 类(静态方法,简化操作):File.WriteAllText("test.txt", "内容"); string content = File.ReadAllText("test.txt");

    • StreamReader/StreamWriter(逐行读写):

      using (StreamReader sr = new StreamReader("test.txt")) {string line;while ((line = sr.ReadLine()) != null) Console.WriteLine(line);
      }
  • 线程(Thread)

    using System.Threading;
    // 定义线程执行的方法
    void PrintNumbers() {for (int i = 0; i < 5; i++) {Console.WriteLine(i);Thread.Sleep(100); // 休眠100ms}
    }
    // 启动线程
    Thread t = new Thread(PrintNumbers);
    t.Start(); // 线程开始执行
  • Socket 通信(TCP)

    • 服务器:TcpListener server = new TcpListener(IPAddress.Any, 8888); server.Start(); TcpClient client = server.AcceptTcpClient();

    • 客户端:TcpClient client = new TcpClient(); client.Connect("127.0.0.1", 8888);

二、C# 高级编程

1. 委托(delegate)与事件(Event)
  • 委托:类型安全的函数指针,可绑定多个方法(多播委托)。

    // 定义委托(与绑定的方法签名一致)
    delegate void MyDelegate(string msg);
    ​
    void ShowMessage(string s) { Console.WriteLine(s); }
    void LogMessage(string s) { File.AppendAllText("log.txt", s); }
    ​
    // 使用
    MyDelegate del = ShowMessage;
    del += LogMessage; // 多播(绑定多个方法)
    del("Hello"); // 执行所有绑定的方法
  • 事件:基于委托的通知机制,仅能在类内部触发(封装委托)。

    class Button {// 定义事件(基于委托)public event MyDelegate Click;// 触发事件(通常私有方法)public void OnClick() {Click?.Invoke("按钮被点击"); // 若有订阅者则触发}
    }
    ​
    // 订阅事件
    Button btn = new Button();
    btn.Click += ShowMessage; // 绑定方法
    btn.OnClick(); // 触发事件,执行ShowMessage
2. 多线程(Thread/Task)
  • Task(推荐,基于线程池,更高效)

    // 启动任务
    Task.Run(() => {for (int i = 0; i < 5; i++) {Console.WriteLine($"Task: {i}");Thread.Sleep(100);}
    }).Wait(); // 等待任务完成
  • 前台线程(默认):程序必须等待其完成才退出;后台线程:程序退出时自动终止。 t.IsBackground = true;(设为后台线程)

3. 匿名函数与 Lambda 表达式
  • 匿名函数:delegate(int x) { return x * 2; }

  • Lambda 表达式(简化匿名函数):

    // 无参数
    Action a = () => Console.WriteLine("Hello");
    // 有参数
    Func<int, int> square = x => x * x; // 输入int,返回int
    Console.WriteLine(square(3)); // 输出9
4. 索引器

允许类像数组一样通过[]访问,常用于集合类。

class MyCollection {private string[] data = new string[10];// 定义索引器public string this[int index] {get { return data[index]; }set { data[index] = value; }}
}
​
// 使用
MyCollection col = new MyCollection();
col[0] = "第一个元素"; // 调用setter
Console.WriteLine(col[0]); // 调用getter,输出"第一个元素"
5. 反射(Reflection)

动态获取类型信息并操作(如调用方法、访问属性)。

Type type = typeof(Person); // 获取Person类型
object obj = Activator.CreateInstance(type, "张三", 20); // 创建实例
MethodInfo method = type.GetMethod("SayHello"); // 获取方法
method.Invoke(obj, null); // 调用方法(输出"我是张三,年龄20")

三、Winform 编程

1. 核心元素
  • 窗体(Form):程序界面容器,常用事件:Load(加载时)、FormClosing(关闭时)。

  • 控件

    • 输入类:TextBox(输入框)、ComboBox(下拉框)、CheckBox(复选框)。

    • 显示类:Label(标签)、DataGridView(表格)、PictureBox(图像)。

    • 交互类:Button(按钮,Click事件)、MenuStrip(菜单)。

  • 属性示例

    • button1.Text = "确定";(按钮文本)

    • textBox1.ReadOnly = true;(输入框只读)

    • dataGridView1.DataSource = list;(表格绑定数据)

  • 事件示例

    // 按钮点击事件(在设计器中绑定或手动注册)
    private void button1_Click(object sender, EventArgs e) {string input = textBox1.Text;MessageBox.Show("输入内容:" + input); // 弹窗
    }

四、数据库

1. SQL 语句(以 SQL Server 为例)
  • 增删改查

    • 新增:INSERT INTO Students (Name, Age) VALUES ('张三', 20);

    • 查询:SELECT * FROM Students WHERE Age > 18;

    • 更新:UPDATE Students SET Age = 21 WHERE Name = '张三';

    • 删除:DELETE FROM Students WHERE Id = 1;

  • 多表联查

    • 内连接(取交集): SELECT s.Name, c.CourseName FROM Students s INNER JOIN Scores c ON s.Id = c.StudentId;

    • 左外连接(保留左表所有数据): SELECT s.Name, c.CourseName FROM Students s LEFT JOIN Scores c ON s.Id = c.StudentId;

五、联合编程(Winform + 数据库)

通过SqlConnection连接数据库,实现增删改查。

// 连接字符串(SQL Server)
string connStr = "Server=.;Database=TestDB;Integrated Security=True;";
​
// 查询数据并绑定到DataGridView
private void LoadData() {using (SqlConnection conn = new SqlConnection(connStr)) {conn.Open();string sql = "SELECT * FROM Students;";SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);DataTable dt = new DataTable();adapter.Fill(dt); // 填充数据dataGridView1.DataSource = dt; // 绑定到表格}
}
​
// 新增数据(按钮点击事件)
private void btnAdd_Click(object sender, EventArgs e) {string name = txtName.Text;int age = int.Parse(txtAge.Text);using (SqlConnection conn = new SqlConnection(connStr)) {conn.Open();string sql = $"INSERT INTO Students (Name, Age) VALUES ('{name}', {age});";SqlCommand cmd = new SqlCommand(sql, conn);cmd.ExecuteNonQuery(); // 执行SQLLoadData(); // 刷新表格}
}
http://www.xdnf.cn/news/1340173.html

相关文章:

  • 打破传统课程模式,IP变现的创新玩法 | 创客匠人
  • RabbitMQ面试精讲 Day 26:RabbitMQ监控体系建设
  • 从零开始的Agent学习(二)-增加文档输出功能
  • 36、供应链计划与执行优化 (军方后勤) - /供应链管理组件/military-logistics-scm
  • 34、扩展仓储管理系统 (跨境汽车零部件模拟) - /物流与仓储组件/extended-warehouse-management
  • 3D 环形旋转图片轮播(纯html,css,js)
  • 力扣hot100:无重复字符的最长子串,找到字符串中所有字母异位词(滑动窗口算法讲解)(3,438)
  • 从零开始理解 K 均值聚类:原理、实现与应用
  • 自学嵌入式第二十四天:数据结构(4)-栈
  • linux-ubuntu里docker的容器portainer容器建立后如何打开?
  • WSL的Ubuntu如何改名字
  • Ubuntu网络图标消失/以太网卡显示“未托管“
  • java项目:如何优化JVM参数?
  • nginx-自制证书实现
  • 读《精益数据分析》:精益画布——创业与产品创新的高效工具
  • 【工具】前端JS/VUE修改图片分辨率
  • 使用Docker部署Coze Studio开源版
  • Advanced Math Math Analysis |02 Limits
  • Oracle CLOB类型转换
  • k8s下的网络通信与认证
  • 【C++】模板(进阶)
  • 从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
  • 在线课程|基于SprinBoot+vue的在线课程管理系统(源码+数据库+文档)
  • openEuler系统中如何将docker安装在指定目录
  • ES_文档
  • 【数据结构】树与二叉树:结构、性质与存储
  • 牛客:链表的回文结构详解
  • 牛客:链表分割算法详解
  • LeetCode100 -- Day3
  • C++---滑动窗口平滑数据