请解释 C# 中事件访问器的概念,并说明如何自定义事件的 add 和 remove 行为。
考察说明
考查对 C# 事件机制及自定义事件访问器的理解。
回答思路
- 【回答框架 1】事件访问器是事件的 add 和 remove 访问器,用于控制事件订阅和退订的细节。默认事件使用编译器生成的访问器,而自定义访问器允许在订阅者列表的添加或移除时执行额外逻辑。
- 【回答框架 2】自定义事件访问器通常通过添加或移除委托来操作事件背后的委托字段。例如,使用私有委托字段,并在 add 访问器中用 Delegate.Combine 添加新委托,在 remove 访问器中使用 Delegate.Remove 移除委托。
- 【回答框架 3】事件访问器还经常用于线程安全场景,比如使用 Interlocked.CompareExchange 和局部变量来安全更新委托字段,防止在事件触发时出现竞态条件。
- 【回答框架 4】使用自定义访问器时,需要注意在类外部只能通过 += 和 -= 访问事件,不能直接赋值,这与默认事件的限制一致。
- 【关键点 1】事件访问器是事件的 add 和 remove 访问器,控制订阅与退订。
- 【关键点 2】自定义访问器通过操作委托字段来实现,常用 Delegate.Combine 和 Delegate.Remove。
- 【关键点 3】线程安全可通过 Interlocked.CompareExchange 保证,但需与事件触发逻辑配合。
- 【关键点 4】事件在类外部只能使用 += 和 -=,不能直接赋值。
- 【易错点 1】不要混淆事件与委托:事件在外部只能通过 add/remove 访问,而委托可直接调用。
- 【易错点 2】若在 add/remove 中执行重逻辑,可能影响性能,尤其是在高并发订阅退订时。
- 【易错点 3】忽略线程安全可能导致订阅列表损坏,需结合锁或原子操作。