Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将'DivideByZeroException'从抛出更改为处理?_C# - Fatal编程技术网

C# 如何将'DivideByZeroException'从抛出更改为处理?

C# 如何将'DivideByZeroException'从抛出更改为处理?,c#,C#,我想给int一个类似于float的行为,即使它能够除以0,但我希望它返回0。 此外,我想重载/运算符以返回一个浮点值(我知道怎么做,但只是为了完整性才提到这个)。 我不想检查每个除法的分母是否为0;我甚至不希望等待抛出异常,因为异常的速度非常慢。 理想情况下,我希望编辑异常的抛出尽可能接近“根”(系统的最低级别(CLR?)检测到int除以零)。是否有任何代码可以像在System或其他任何地方一样进行编辑? 编辑: 整个想法是(理想情况下)使用一个固定精度的浮点。由于这种类型的当前实现在计算上很昂

我想给
int
一个类似于
float
的行为,即使它能够除以0,但我希望它返回0。
此外,我想重载
/
运算符以返回一个浮点值(我知道怎么做,但只是为了完整性才提到这个)。
我不想检查每个除法的分母是否为0;我甚至不希望等待抛出异常,因为异常的速度非常慢。
理想情况下,我希望编辑异常的抛出尽可能接近“根”(系统的最低级别(CLR?)检测到
int
除以零)。是否有任何代码可以像在
System
或其他任何地方一样进行编辑?
编辑:
整个想法是(理想情况下)使用一个固定精度的浮点。由于这种类型的当前实现在计算上很昂贵,而且有些不完整,因此使用int似乎是更好的主意,但要注意处理无限除法结果。

因此,需要截取异常值除以零,并以某种方式处理它,使其被忽略,并在INT范围内返回一个“奇数”值。

使用
INT
无法做到这一点

系统
或其他任何地方都没有代码可以编辑以实现类似的功能

但是,您可以定义自己的
struct Integer
,它将封装
int
,然后为它定义重载运算符,它将以您想要的方式处理所有算术。你甚至可以让它在每次检测到并防止被零除时播放一个带有莱纳德·科恩的《哈利路亚》的mp3


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

使用
int
无法做到这一点

系统
或其他任何地方都没有代码可以编辑以实现类似的功能

但是,您可以定义自己的
struct Integer
,它将封装
int
,然后为它定义重载运算符,它将以您想要的方式处理所有算术。你甚至可以让它在每次检测到并防止被零除时播放一个带有莱纳德·科恩的《哈利路亚》的mp3


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

正如其他人所说,您不能这样做。你不能重新定义数学。您可能得到的最佳解决方案是使用扩展方法。比如:

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在他的回答中所建议的,您可以用自己的逻辑创建自己的结构。

正如其他人所说,您不能这样做。你不能重新定义数学。您可能得到的最佳解决方案是使用扩展方法。比如:

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在他的回答中所建议的,您可以使用自己的逻辑创建自己的结构。

这听起来好像您真的想使用float而不是int。
。。。让它能够除以0,但我希望它返回0。
那么你想改变语言(和数学)的基本规则吗?将一个浮点除以0将得到无穷大,所以你所提出的并不是真正的浮点。我更关注你的设计,而不是解决这个问题,因为即使你以某种方式“破解”它,这不是一个好的做法。想象一下,如果这是一个巨大的项目,有很多事情都依赖于这个逻辑。这不是一条路要走。后退一步,重新思考。你真的需要这个吗?没有其他方法可以做到这一点吗?听起来你真的想用float而不是int。。。让它能够除以0,但我希望它返回0。那么你想改变语言(和数学)的基本规则吗?将一个浮点除以0将得到无穷大,所以你所提出的并不是真正的浮点。我更关注你的设计,而不是解决这个问题,因为即使你以某种方式“破解”它,这不是一个好的做法。想象一下,如果这是一个巨大的项目,有很多事情都依赖于这个逻辑。这不是一条路要走。后退一步,重新思考。你真的需要这个吗?没有别的办法吗?拳击对我来说太贵了。绝对不是数学在运行时决定不可能被零除。就像@Matt Burland说的:除以0得到无穷大(带浮点数)。那么,从CPU到编译器,到底是哪一部分在允许浮点的同时阻止整数除以零呢?这就是CPU。具体地说,CPU的算术逻辑单元(ALU)和
struct
不一定意味着装箱,当然也不比
int
意味着装箱。就生成的机器代码而言,一个只包含
int
struct
相当于一个
int
,如果碰巧发现它不是完全等价的,那么这将是编译器的一个缺点,这只是一个时间问题,直到它被修复。感谢这个解决方案-我尝试了它,仅仅将
int
封装在
int
结构中,一次普通除法(1000000次)产生40ms,而直接
int
除法(1000000次)产生16ms@mireazma:IEEE-754标准中定义了浮点数除零,对我来说,拳击是一种昂贵的资源。绝对不是数学在运行时决定不可能被零除。就像@Matt Burland说的:除以0得到无穷大(带浮点数)。那么