为了账号安全,请及时绑定邮箱和手机立即绑定

你在C#或.NET中看到的最奇怪的情况是什么?

你在C#或.NET中看到的最奇怪的情况是什么?

白衣染霜花 2019-06-28 15:07:34
你在C#或.NET中看到的最奇怪的情况是什么?我收集了几个角落的箱子大脑挑逗者总是想听更多。该页面只涉及C#语言位和bobs,但我也发现核心.NET内容也很有趣。例如,这里有一个不在页面上,但我觉得难以置信的:string x = new string(new char[0]);string y = new string(new char[0]);Console.WriteLine(object.ReferenceEquals(x, y));我希望打印错误-毕竟,“新”(引用类型)总创建一个新的对象,不是吗?C#和CLI的规范都表明它应该。在这个特殊的情况下。它打印了True,并在我测试过的框架的每个版本上都这样做了。(无可否认,我还没有在Mono上试过.)我要说的是,这只是我想要的那种东西的一个例子-我并不是特别想要讨论和解释这个奇怪的东西。(这与正常的字符串实习不一样;特别是,在调用构造函数时,通常不会发生字符串实习。)我真的是在要求类似的奇怪行为。还有其他宝石藏在外面吗?
查看完整描述

3 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

银行家的四舍五入。

这个不是编译器的错误或故障,但肯定是一个奇怪的角落的情况.

.NET Framework使用了一种称为Banker舍入的方案或舍入。

在银行家的四舍五入中,0.5个数字被四舍五入到最近的偶数,所以

Math.Round(-0.5) == 0Math.Round(0.5) == 0Math.Round(1.5) == 2Math.Round(2.5) == 2etc...

这可能导致一些意想不到的错误,在财务计算的基础上,更著名的回合半四舍五入。

VisualBasic也是如此。


查看完整回答
反对 回复 2019-06-28
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

如果调用为Rec(0)(不是在调试器下)?

static void Rec(int i){
    Console.WriteLine(i);
    if (i < int.MaxValue)
    {
        Rec(i + 1);
    }}

答:

  • 在32位JIT上,它应该会导致StackOverflow异常。
  • 在64位JIT上,它应该将所有数字打印到int.MaxValue

这是因为64位JIT编译器应用尾调用优化。,而32位的JIT没有。

不幸的是,我没有一台64位的机器来验证这一点,但是这个方法确实满足了尾叫优化的所有条件。如果有人有,我想看看是否是真的。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 331 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信