2014-09-19 79 views
1

假設我有一些String s。MS C#實現字符串首先檢查不可變基字符串的ReferenceEquals?

String a = "this String"; 
Strinb b = "this String"; 
String c = a; 

我的理解串ab不nescessarily共享相同的immuteable基本字符串。但字符串ca的副本,所以它在內部指向相同的不可變串。

如果我比較ab的等式,它將返回true。至少因爲它們表示相同的字符序列。

如果我比較ac的等式,它將返回true。它是否檢查要這樣做的字符還是比較指向不可變串的指針?


編輯:

要回答我怎麼會檢查平等:

private void StackoverflowEquals() 
    { 
     String a = @"http://stackoverflow.com/questions/25932695/does-ms-c-sharp-implementation-of-string-check-referenceequals-of-the-immuteable"; 
     String b = @"http://stackoverflow.com/questions/25932695/does-ms-c-sharp-implementation-of-string-check-referenceequals-of-the-immuteable"; 
     String c = a; 

     if (!(a == b)) throw new Exception(); 
     if (!(a == c)) throw new Exception(); 
    } 
+3

你是如何檢查他們的平等? – 2014-09-19 11:18:57

+3

當然,[它的第一件事](http://referencesource.microsoft.com/#mscorlib/system/string.cs#603)。接下來檢查長度相等,這也很便宜。 – 2014-09-19 11:29:12

回答

2

是的,它的作用。下面是平等的源代碼:

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
     public override bool Equals(Object obj) { 
      if (this == null)      //this is necessary to guard against reverse-pinvokes and 
       throw new NullReferenceException(); //other callers who do not use the callvirt instruction 

      String str = obj as String; 
      if (str == null) 
       return false; 

      if (Object.ReferenceEquals(this, obj)) 
       return true; 

      if (this.Length != str.Length) 
       return false; 

      return EqualsHelper(this, str); 
     } 

有關完整的串類的源代碼見this

+0

你從哪裏得到這些代碼? – svick 2014-09-19 11:41:11

+0

@svick查看編輯答案。 – brz 2014-09-19 11:43:12