熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

對 String 的幾個錯誤認識[2]

2022-06-13   來源: .NET編程 

  從這段源碼中我們看到net 在字符串等號操作符中調用了 SystemString::Equals 這個靜態方法來比較這個靜態方法的代碼如下

     // Determines whether two Strings match

        public static bool Equals(String a String b) {

            if ((Object)a==(Object)b) {

                return true;

            }

 

            if ((Object)a==null || (Object)b==null) {

                return false;

            }

 

            return EqualsHelper(a b);

        }

  從這個代碼我們可以看出兩個string 類型在進行==操作符比較時先比較引用是否相等如果不等會調用EqualsHelper比較值是否相等這也就是我們看到用==操作符比較兩個引用不同但值相同的string時得到true的原因 

  一點建議

  從時間角度考慮性能如果字符串是駐留的那麼用==操作符比較起來在被比較的兩個字符串相等的情況下將會非常快但從空間效率考慮

  如果對所有字符串都駐留勢必導致大量內存無法被釋放折中一下可以在構造字符串後進行如下操作這樣構造出來的字符串如果

  已經駐留則使用駐留後的字符串引用否則使用原來引用這樣除了可以提高比較的效率還可以減少內存的開銷因為該字符串之前已經被駐留過了

  我們沒有必要再重新申請其它的內存來存儲相同的字符串 當然調用TryIntern本身會有一些性能損失所以還要視具體情況使用如果該字符串構造出來後

  被頻繁用於比較則在第一次構造時使用TryIntern損失一些性能是值得的否則就不值得建議直接使用構造出來的字符串

string s = MyTest;
string s = new StringBuilder()Append(My)Append(Test)ToString();

s = TryIntern(s);

public static string TryIntern(string str)
{
internStr = stringIsInterned(str);

return internStr == null? str: internStr;
}

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15386.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.