本文写作缘起于阮的讨论——《FxCop告诉我,检查一个字符串是否为空要用string.Length。》。其实用过FxCop的人都知道它会建议你使用String.Length属性来判断字符串是否为空串,但你又是否明白其中的缘由呢?今天有点闲,特意写下这篇文章,希望有点帮助。
1. 三种常用的字符串判空串方法:
2. 深入内部机制:
public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<string> { static String() { string.Empty = ""; // Code here } // Code here public static readonly string Empty; public static bool operator ==(string a, string b) { return string.Equals(a, b); } public static bool Equals(string a, string b) { if (a == b) { return true; } if ((a != null) && (b != null)) { return string.EqualsHelper(a, b); } return false; } private static unsafe bool EqualsHelper(string ao, string bo) { // Code here int num1 = ao.Length; if (num1 != bo.Length) { return false; } // Code here } private extern int InternalLength(); public int Length { get { return this.InternalLength(); } } // Code here }
Rotor里面String类的代码与此没什么不同,只是没有EqualsHelper方法,代之以如下的声明:
public extern bool Equals(String value);
进一步分析:
public static bool operator ==(string a, string b); public static bool Equals(string a, string b); private static unsafe bool EqualsHelper(string ao, string bo);