VB中‘RaiseEvent’语句的C#等价写法及带byte参数事件定义问题
你的C#写法完全是VB
RaiseEvent的正确等价实现! 没错,你写的这段C#代码完美对应了VB里的RaiseEvent逻辑,两者的行为完全一致,下面给你拆解下对应关系:
1. 事件与委托的对应
VB里的事件定义:
Public Event LowOnFuel(ByVal FuelLevel As Byte)
VB编译器会在后台自动生成一个匹配签名的委托类型,而C#需要显式定义委托(或者用泛型委托简化)。你写的:
public delegate void LowOnFuelHandler(byte fuelLevel); public event LowOnFuelHandler LowOnFuel;
完全对应VB的隐式委托生成,是标准且正确的写法。
2. 事件触发的空安全检查
VB的RaiseEvent LowOnFuel(mFuelLevel)会自动处理事件无订阅者的情况(不会抛出空引用异常),而你C#里用的:
LowOnFuel?.Invoke(mFuelLevel);
通过空条件运算符?.实现了完全相同的逻辑——只有当LowOnFuel有订阅者时才会调用委托,避免了空引用风险,这和VB的RaiseEvent行为完全匹配。
额外小提示:更简洁的C#写法
你也可以用.NET内置的泛型委托Action<byte>来替代自定义的LowOnFuelHandler,这样能少写一行委托定义,代码更简洁,功能完全一样:
public event Action<byte> LowOnFuel; // 触发事件的代码保持不变 if (mFuelLevel < 30 && mFuelLevel > 0) { LowOnFuel?.Invoke(mFuelLevel); }
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

