我第一感觉是否中木马了。对机器进行了仔细的检查,应该不是。
所以这里报告一下,有人有类似的问题吗?
That’s right. Looking at Length property equals to zero or not will be much faster than string equality comparison. In a more common case, use IsNullOrEmpty method instead in .net 2.0. This method checks the coming argument null or not, and then call String.get_Length to compare with 0.
Quote
一般人都喜欢用 (a==null || a=="" )来判断字符串是否是空的,也有部分人会用 String.IsNullOrEmpty(a)来判断(这里要大骂一下微软写MSDN帮助的人,这个方法的说明居然明显地写错了,包括IDE中的代码提示也是错的!!也许因此很多人本来知道这个方法的却被这个提示给误导了!)
现在回到假设已经知道a不是null的情况,我们需要判断a是否是空字符串,如何判断呢? a=="" 估计是大部分人的选择,当然这个时候继续用String.IsNullOrEmpty(a)也是无可厚非的,但是毕竟多了一句废代码, 也许大部分人认为把一个字符串和""比较是一个简单的操作,不过事实上并不是这样~~~~~~~
让我们ILDASM一下,看看这个 == 运算符到底做了什么事:
代码首先是把null的情况当特殊情况先处理了,然后
(省略了MSIL equalhelper代码)
是否感觉有些可怕?在a是空字符串的情况下,2个空字符串比较将会执行多少代码啊,首先是先比较字符串的长度,如果长度不同则返回假,可是此时2个字符串都是长度为0所以不符合这个条件,这个分别锁住a和""这两块内存,然后初始化4个指针来指向它们,再用2个复杂的循环和表达式运算,移动指针比较(很庆幸,由于是空字符串,2个循环实际上分别只判断了一次,并不会执行循环体)然后再判断字符串的长度~~~~ 至此,a=="" 返回了一个true ~~~事实上事情本可以更加简单得多,如果我们使用另外一个表达式 a.Length == 0 则世界将美好许多,不再需要指针,不再需要那些复杂的语句,我们需要的仅仅是:
.method public hidebysig specialname instance int32 get_Length() cil managed internalcall
事实上在上面的L_0001和L_0009的最终语句里这句话已经被调用了2次了~~~
所以下次需要判断一个字符串是不是空字符串的时候,使用a.Length==0要比a=="" 执行起来快得多,需要执行的机器指令也少得多!
比如.net代码引用了非托管代码,而非托管代码是不能在linux下运行的。这时会出现P/Invoke的问题。我不知道如何解决,重写吧。
linux下的路径分隔符与win下不一样,建议.net下的全部写成 /,或者用 Path.SeparatorChar,否则会出现在linux下找不到文件的问题
linux下大小写敏感,所以在.net代码里也要注意文件写的大小写问题,应当严格一致。
对winform情况更为复杂,一些.net下的功能可能在MONO下还没有完全支持,所以在porting的时候应当注意这些功能。
看官方网站,目前MONO处在1.x到2.0中间的某阶段,这意味着MONO还没有完全支持2.0,一个复杂的项目从.net到mono还是需要efforts才能搞定。