c# 312 事件 委托

c#

string stringBuilder

string 引用类型 不可变

stringBuilder 引用类型 改自己 频繁拼接字符串

GC

垃圾回收

清理堆上不用的对象,自动释放内存

ref out

ref

public Modify(ref int\[\] arr){

arr0=1;

}

int\[\] ayy1=new int5;

Modify(ref arr1);

out

public Modify(out int\[\] arr2){

int\[\] arr={1,2,3};

}

int\[\] arr1;

Modify(out arr1);

csharp 复制代码
// ✅ ref:传引用,调用前必须赋值
public void ModifyRef(ref int[] arr) {
    arr[0] = 1; 
}
int[] arr1 = new int[5]; // 必须先赋值
ModifyRef(ref arr1);     // 必须加 ref 关键字

// ✅ out:传输出值,调用前不用赋值,方法内必须赋值
public void ModifyOut(out int[] arr) {
    arr = new int[] {1,2,3}; // 方法内必须给 out 参数赋值
}
int[] arr2; // 不用初始化
ModifyOut(out arr2);        // 必须加 out 关键字

泛型

ListT

优点

动态扩容

指定类型:安全

ArrayList

动态扩容
不指定类型,容易出错

Array

不安全
啥都可以存

正确:Array(数组):长度固定,指定类型(安全),不能动态扩容

(Array 和 ArrayList 区别:Array 是强类型,ArrayList 是 object 弱类型)

clr

帮助管理代码的助手

.net程序的运行管家

垃圾回收,管理代码,管理内存

多态

一个方法,不同结果

public class animal(){

void bark(){}

}

public class dog:animal(){

void bark(){

Console.WriteLine("ww");

}

public class cat:animal(){

void bark(){

Console.WriteLine("MM");

}

}

}

面向对象

封装,多态,继承

封装

方法中,部分可见,数据隐藏

int int?

int? 值可以为null

async/await

异步,避免卡死

程序一边等 一边干别的

进程

程序运行的房子

线程

房子内运行的各种程序

null dbnull

null:空置

dbnull:代码里的控制 数据库内的空值
DBNull:专门表示数据库字段的"空值",和 C# 里的 null 不是一个东西

lock

锁住当前线程

避免其他数据侵入,避免同时操作串口,导致数据错乱

构造函数

类在被创建时 第一个被执行的方法 用于初始化

接口

实现一套模板

Icommand

实现ICommand 接口,必须实现 Excute ,CanExcute两套方法

事件、委托:

1. 委托 是什么?

委托 = 方法的"电话号码本"

  • 它是个引用类型
  • 里面可以存一个或多个方法
  • 你一"拨打"委托,里面的方法就全部执行

它就是个普通变量,谁都能改、谁都能调用。


2. 事件 是什么?

事件 = 加了安全锁的委托

事件本质就是:
被 event 关键字保护起来的委托

它比普通委托多两个限制:

  1. 外部不能随便赋值(不能把里面的方法直接覆盖)
  2. 外部不能随便调用(只能由定义它的类自己触发)

3. 一句话总结关系

  • 委托:自由、开放、谁都能改
  • 事件:安全、受限、只能订阅、不能乱改

最经典的例子:按钮点击

  • 按钮里有个 Click 事件
  • 你只能写:
    button.Click += 我的方法;
  • 你不能 直接:
    button.Click = null; // 会报错
  • 你不能 直接:
    button.Click(); // 也报错

这就是事件在保护安全。


你现在这三个点是不是一下就通了:

  • 委托是引用类型 ✅
  • 委托可以挂多个方法 ✅
  • 事件就是加了锁的委托 ✅
csharp 复制代码
// 定义一个委托:能存"没有参数、没有返回值"的方法
public delegate void MyDelegate();
csharp 复制代码
public class Test
{
    // 公开的委托
    public MyDelegate myDelegate;
}
csharp 复制代码
Test t = new Test();

// 你可以随便赋值、覆盖
t.myDelegate = A;
t.myDelegate = B; // A 直接被顶没了

// 你还能直接调用
t.myDelegate(); 
csharp 复制代码
Test t = new Test();

// 你可以随便赋值、覆盖
t.myDelegate = A;
t.myDelegate = B; // A 直接被顶没了

// 你还能直接调用
t.myDelegate(); 

3)事件 = 加了锁的委托

csharp 复制代码
public class Test
{
    // 加了 event,就是事件
    public event MyDelegate MyEvent;
}
csharp 复制代码
Test t = new Test();

// 只能 += 订阅、-= 取消
t.MyEvent += A;
t.MyEvent += B;

// 下面这两行,**直接报错,不让你干**
// t.MyEvent = A;       ❌ 不能直接赋值覆盖
// t.MyEvent();          ❌ 不能直接调用

一句话总结

委托:公共电话,谁都能打、谁都能改

事件:带锁的电话,只能订阅,不能乱改、乱触发

相关推荐
weixin_41965831几秒前
CANoe 使用指南:从输出窗口到数据回放的完整实战教程
开发语言·功能测试·车载系统·自动化·汽车
当青春邂逅吉米多维奇2 分钟前
C#图解教程(第5版) 同步方法
开发语言·c#
骇客野人9 分钟前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质12 分钟前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
波力海苔夹心脆67517 分钟前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net
外收内放36 分钟前
Python基础语法练习题(62原始版本及其优化版本)
开发语言·python
马剑威(威哥爱编程)38 分钟前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
三月微暖寻春笋1 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板
释厄6231 小时前
智能体释放度子集律——文本 ⊂ 音频 ⊂ 视频⊂ 游戏
开发语言·游戏·microsoft·音视频
Sarvartha1 小时前
Object 类
java·开发语言