You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中带On前缀的事件订阅方法是否违反命名规范?

关于C#事件订阅方法使用On前缀的命名规范问题

首先直接给结论:订阅事件的方法使用On前缀确实违反了C#的通用命名约定,属于需要避免的不良实践。

为什么会有这个约定?

在C#的设计规范里,On[EventName]这个命名模式是专门留给事件发布者类的——也就是定义事件的类内部,用来触发(raise)该事件的方法。比如你例子里Enemy类的OnEnemyKilled,它的核心职责应该是:

// Enemy类内部的触发方法示例
protected virtual void OnEnemyKilled(EnemyKilledArgs args)
{
    EnemyKilled?.Invoke(this, args);
}

这个命名的意义是明确告诉其他开发者:“这是发布者用来触发事件的方法,不是处理事件的逻辑”。

为什么订阅者用On前缀会有问题?

如果你的RoundManager类里的事件处理方法也叫OnEnemyKilled,会带来两个核心问题:

  1. 语义混淆:其他开发者看到这个方法名时,第一反应会以为这是触发事件的方法,而非订阅处理逻辑,增加了理解成本。
  2. 命名冲突风险:如果两个类在同一个命名空间下,调用时如果不明确指定类名,可能会引发编译歧义(虽然实际编译可能通过,但可读性极差)。

更好的命名方案

对于订阅者的事件处理方法,推荐用以下几种命名方式:

  • 用Handle[EventName]前缀,比如HandleEnemyKilled,明确表示这是事件处理方法;
  • 直接用描述具体行为的名字,比如你的例子里这个方法负责更新统计、刷新敌人、计数,完全可以叫ProcessEnemyDeath,语义更清晰;
  • 如果需要区分不同类的处理逻辑,也可以加上类名前缀,比如RoundManager_EnemyKilledHandler(不过这种一般是在方法非常通用时才用)。

修改后的代码示例:

// RoundManager类中的事件处理方法
void HandleEnemyKilled(EnemyKilledArgs args)
{
    UpdateStat(args);
    SpawnNewEnemy();
    _enemyKilled++;
}

// 订阅/取消订阅
Enemy.EnemyKilled += HandleEnemyKilled;
Enemy.EnemyKilled -= HandleEnemyKilled;

总结

遵守命名约定的核心目的是让代码更易读、易维护,On前缀的专属语义已经是C#社区的共识,所以尽量不要在订阅者的处理方法上使用它。

内容的提问来源于Stack Exchange,提问作者blablaalb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:26:59