关键词:委托不可变性 · 多播委托 · 调用列表管理
使用 += 为委托“添加”方法时(如 delVar += SCl.m3;):
内存变化图解
MyDel delVar = inst.MyM1; // 初始委托 (指向方法1)
delVar += SCl.m3; // 新建委托 (方法1+方法2)
delVar += X.Act; // 再新建委托 (方法1+2+3)
delVar -= SCl.m3; // 从调用列表移除方法
// 正确检查方式
if (delVar != null)
{
delVar(55);
}
// 或使用空条件运算符
delVar?.Invoke(65);
⚠️ 未检查空委托直接调用将抛出 NullReferenceException
关键特性:
delegate void PrintFunction(); // 无返回值委托
class Test
{
public void Print1() => Console.WriteLine("Print1 -- instance");
public static void Print2() => Console.WriteLine("Print2 -- static");
}
class Program
{
static void Main()
{
var t = new Test();
PrintFunction pf = t.Print1; // 初始化
// 添加三个方法(实际新建两次委托)
pf += Test.Print2;
pf += t.Print1;
pf += Test.Print2;
pf?.Invoke(); // 安全调用
}
}
输出结果:
Print1 – instance
Print2 – static
Print1 – instance
Print2 – static
掌握委托的不可变本质,能有效避免异步编程中的常见陷阱。建议在事件处理等场景中始终遵循「添加后必移除」原则,防止内存泄漏问题。