我怎么能改变' DivideByZeroException '从抛出到处理

本文关键字:处理 DivideByZeroException 能改变 | 更新日期: 2023-09-27 18:18:33

我想给int一个类似于float的行为,即使其能够除以0 我希望它返回0。
此外,我想重载/操作符为int返回一个浮点数(我知道怎么做,但只提到完整性)。
我不想每次除法都检查分母是否为0;我也宁愿不等待异常被抛出,因为异常是缓慢的。
理想情况下,我想编辑异常的抛出尽可能接近"根"(系统的最低级别(CLR?)检测int除以零)。是否有任何代码,我可以编辑像System或其他地方?
编辑:
整个想法是(理想情况下)使用一个固定精度的浮点数。由于这种类型的当前实现在计算上很昂贵,而且有些不完整,使用int似乎是更好的主意,但要注意处理除法的无限结果。
因此,需要拦截EXCEPTION_INT_DIVIDE_BY_ZERO,并以某种方式处理它,使其被忽略,并返回int范围内的"奇数"值。

我怎么能改变' DivideByZeroException '从抛出到处理

正如其他人所说,你不能那样做。你无法重新定义数学。你能得到的最好的解决方案就是有一个扩展方法。比如:

public static int SafeDivision(this int nom, int denom)
{
    return denom != 0 ? nom/denom : 0;
}

你可以这样使用:

Console.WriteLine(10.SafeDivision(0));    // prints 0
Console.WriteLine(10.SafeDivision(2));    // prints 5

使用起来有点繁琐…

或者就像@MikeNakis在他的回答中建议的那样,你可以用你自己的逻辑创建你自己的结构。

int不能这样做。

System或其他任何地方都没有代码可以编辑来实现这种类型的任何东西。

然而,可以做的是定义自己的struct Integer,它将封装int,然后为它定义重载操作符,它将以所有你想要的方式处理所有的算术。你甚至可以让它在每次检测和防止除零时播放伦纳德·科恩的哈利路亚 mp3。

您将必须检查每次除法的分母是否为零。这将为您节省抛出异常的开销,而抛出异常的开销可能要高出数万倍。