.NET中的字符串(3):字符串的比较
在.NET中,对字符串的比较操作并不仅仅是简单的比较二者的值,= =操作首先比较两个字符串的引用,如果引用相同,就直接返回True;如果不同再去比较它们的值。所以如果两个值相同的字符串的比较相对于引用相同的字符串的比较要慢,中间多了一步判断引用是否相同。看下面这段代码:
1using System; 2 3namespace Demo3 4{ 5 /**//// <summary> 6 /// String类型的比较 7 /// </summary> 8 public class Test 9 { 10 public static void Main(string[] args) 11 { 12 string a = "1234"; 13 string b = "1234"; 14 string c = "123"; 15 c += "4"; 16 17 int times = 1000000000; 18 int start,end; 19 20 /**////测试引用相同所用的实际时间 21 start = Environment.TickCount; 22 for(int i=0;i<times;i++) 23 { 24 if(a==b) 25 {} 26 } 27 end = Environment.TickCount; 28 Console.WriteLine((end-start)); 29 30 /**////测试引用不同而值相同所用的实际时间 31 start = Environment.TickCount; 32 for(int i=0;i<times;i++) 33 { 34 if(a==c) 35 {} 36 } 37 end = Environment.TickCount; 38 Console.WriteLine((end-start)); 39 40 Console.ReadLine(); 41 } 42 } 43} 44 执行的结果(运行的结果可能有些不同): 1671 4172
由此我们看出值相同时的比较用= =比引用相同时的比较慢了好多。这里仅仅是一个测试,因为做这样的比较并没有任何实际的意义。
有一点需要明确的是,.NET中==跟Equals()内部机制完全是一样的,==是它的一个重载。
1public static bool operator ==(string a, string b) 2{ 3 return string.Equals(a, b); 4} 5 1public static bool Equals(string a, string b) 2{ 3 if (a == b) 4 { 5 return true; 6 } 7 if ((a != null) && (b != null)) 8 { 9 return a.Equals(b); 10 } 11 return false; 12}