是.NET Bug不断吗?

今天在博客园阅读了一篇文章《为何.NET总是Bug不断??》,心为之一惊,以为又发现了什么新Bug,马上进去查看其内容,并且顺带看了所有的评论。

一个非常简单的程序

string action = "cancel"; if(action.Equals("cancel")) ...{ Console.WriteLine("true"); } else ...{ Console.WriteLine("false"); }

>

置疑有两个:
  1. 在立即窗口中,无法使用action.Equals;
  2. 为什么答案不是true?
关于第1个问题,我做了一下实验,完全可以使用,因为action本身并非C#的关键字。我在输入时还会自动提示,但请注意,在使用立即窗口前,要确认的两件事情:
  • 当前是使用的Debug模式,而非Release模式
  • 在程序中设置了正确的断点,程序并且运行到该断点。

关于立即窗口的具体使用办法,请阅读MSDN Library当中的文字:

当代码处于中断模式时,“立即窗口”同断点所在的过程具有相同的范围。这样可以测试和更改变量的值。此外,还可用“立即窗口”调用过程并用不同的数据测试过程,但无需从头开始运行应用程序。

第二个问题,我的测试并没有出现错误,直接显示的是True,我比较关心的是评论栏中所发表的评论,有人写道:用Equals好像比较的是对象,虽然字符串是相同的,但如果是对象怎么会就是一个呢? 。然后有人在后面以导师的身份教导我们说:他说的是对的。如果你阅读了这篇文章,以后可能就会先入为主了,不会有人遇到此问题再去阅读权威资料了,那么是不是正确的呢?

请查看MSDN文档,因为action是一个String的对象,那么查看一下String.Equals方法的说明,里面很清楚的表明:String.Equals方法是用来确定两个 String 对象是否具有相同的值

当然,有兴趣者或者刨根究底者可以去阅读这部分源代码,即SSCLI或者MONO的实现。

做为程序员,希望大家还是少一些浮躁。类似于热衷于国内某些媒体的头版头条,如《微软专家质疑.NET》,或者《微软反间谍软件逆子轼父删除IE》之类的愚人节新闻。把大部分精力浪费在这些毫无意义的争论上,对大家没有益处。只会越来越浮躁。

千万不要论坛文化带到博客园来

 
打赏作者

“是.NET Bug不断吗?”的16个回复

  1. “千万不要论坛文化带到博客园来。”
    谢谢开心的提醒!
    博客园会鼓励大家在发表文章之前, 多一些思考!

  2. 国内某专家:“怎么会是.net的Bug呢,明明是程序员的编程风格不好,怎么可以这样写程序啊?"。

  3. 编译器好像没有责任将你的"cancel"字符串转化为一个String对象吧
    Equals要求两个对象都实现了该方法,否责只是比较两个对象的地址是否相同。

  4. 对于你的见解我大部分同意,我们目前是在做一个项目,昨天确实遇到了此问题,但由于时间关系我未能花时间重现(后来将action改成paction后症状消失,同时我回忆上次同事给我的代码出现默名的问题,我调用了两个个构造函数 new OrderItem()和new Order(),这两个个类是继承来的,同时调用了个类的构造函数,结果出现一个怪现象就是 先后顺序颠倒就发生第二个构造函数调用用会向数据库内插入一条记录,但我们在插入数据库的那段代码设了断点怎么也到不了那个断点。结果当我们将 OrderItem类改名后现状消失,我们试图查找过是否有重载,重名,基类的构造函数等都没有问题。所以只能是怀疑微软在编译成托管代码时出了问题。

    希望能和你继续探讨.NET 技术

  5. To Philips: 无意责难,只是希望在遇到问题后,不要动不动就责难别人,而自己先动手,认真分析问题,才能对于个人的成长有好处。

    动不动就浮躁去想一些“莫须有”的罪名,只会让自己越来越肤浅,总会“心安理得”的去处理自己遇到的实际问题。

  6. 开心说的不错,而且我看过string类的源码,==就是Equals的重载,也即==和Equals是完全一样的。这个和Java不同。Java确实是不一样的。
    看下面的源码(在123aspx上的):
    /// <include file=’docString.uex’ path=’docs/doc[@for="String.operatorEQ"]/*’ />
    public static bool operator == (String a, String b) {
    return String.Equals(a, b);
    }

    我也和dudu说过,博客园现在也越来越杂乱了,什么帖子都往主页上放,结果好的帖子很快沉底了,有时找起来都要找半天。所以还是清理一下的好。

  7. 随便谁都可以加入的社区
    必然是质量低劣的社区,虽然现在可能还不是

    现实社会也如此

  8. Pingback: 实验室操作台
  9. Pingback: 邵氏硬度计
  10. Pingback: sf6气体回收装置
  11. Pingback: 生化分析仪
  12. 编译器并不再重新构造cancel,而是发现了有个与cancell值相同的String时,认为他们是同一个不再构造一个新的了。equals方式已经重载了"==".

评论已关闭。