java.lang.String的trim()方法詳解

String.Trim()方法到底爲咱們作了什麼,僅僅是去除字符串兩端的空格嗎?數組

一直覺得Trim()方法就是把字符串兩端的空格字符給刪去,其實我錯了,並且錯的比較離譜。函數

首先我直接反編譯String類,找到Trim()方法:this

public string Trim()
{    return this.TrimHelper(WhitespaceChars, 2);
}

TrimHelper方法有兩個參數,第一個參數名WhitespaceChars,首字母盡然是大寫的,確定有文章,真不出我所料:spa

internal static readonly char[] WhitespaceChars;

 這裏只是定義它,沒有賦值,並且是靜態的,咱們看看構造函數去,果真找到:指針

static String()

{ Empty = " "; WhitespaceChars = new char[] { '/t', '/n', '/v', '/f', '/r', ' ', '/x0085', '/x00a0', '?', ' ', ' ', ' ', ' ', '?', '?', '?', '?', '?', ' ', '?', '?', '/u2028', '/u2029', ' ', '?' }; }  code

Trim方法就是把字符串兩端的這些字符給刪去?我很堅決的猜測到。orm

繼續咱們的探索,直接反編譯TrimHelper,哇,也許這個纔是我想要的,私有的TrimHelper方法:字符串

private string TrimHelper(char[] trimChars, int trimType)
{    int num = this.Length - 1;    int startIndex = 0;    if (trimType != 1)
    {
        startIndex = 0;        while (startIndex < this.Length)
        {            int index = 0;            char ch = this[startIndex];
            index = 0;            while (index < trimChars.Length)
            {                if (trimChars[index] == ch)
                {                    break;
                }
                index++;
            }            if (index == trimChars.Length)
            {                break;
            }
            startIndex++;
        }
    }    if (trimType != 0)
    {
        num = this.Length - 1;        while (num >= startIndex)
        {            int num4 = 0;            char ch2 = this[num];
            num4 = 0;            while (num4 < trimChars.Length)
            {                if (trimChars[num4] == ch2)
                {                    break;
                }
                num4++;
            }            if (num4 == trimChars.Length)
            {                break;
            }
            num--;
        }
    }    int length = (num - startIndex) + 1;    if (length == this.Length)
    {        return this;
    }    if (length == 0)
    {        return Empty;
    }    return this.InternalSubString(startIndex, length, false);
}

 通過分析和運行,基本上知道了這個方法是幹什麼的了。源碼

TrimHelper方法有兩個參數:string

第一個參數trimChars,是要從字符串兩端刪除掉的字符的數組;

第二個參數trimType,是標識Trim的類型。就目前發現,trimType的取值有3個。當傳入0時,去除字符串頭部的空白字符,傳入1時去除字符串尾部的空白字符,傳入其餘數值(好比2) 去除字符串兩端的空白字符。

最後再看看真正執行字符串截取的方法:

private unsafe string InternalSubString(int startIndex, int length, bool fAlwaysCopy)
{    if (((startIndex == 0) && (length == this.Length)) && !fAlwaysCopy)
    {        return this;
    }    string str = FastAllocateString(length);    fixed (char* chRef = &str.m_firstChar)
    {        fixed (char* chRef2 = &this.m_firstChar)
        {
            wstrcpy(chRef, chRef2 + startIndex, length);
        }
    }    return str;
}

 原來也用指針的?第一次看到,效率應該比較高吧。 
最後總結一下: 
String.Trim()方法會去除字符串兩端,不單單是空格字符,它總共能去除25種字符: 
('/t', '/n', '/v', '/f', '/r', ' ', '/x0085', '/x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '?', '/u2028', '/u2029', ' ', '?')


若是你想保留其中的一個或多個(例如/t製表符,/n換行符,/r回車符等),請慎用Trim方法。

請注意,Trim刪除的過程爲從外到內,直到碰到一個非空白的字符爲止,因此無論先後有多少個連續的空白字符都會被刪除掉。

 最後附上兩個相關的方法(也是String類直接提供的),分別去除字符串頭部空白字符的TrimStart方法和去除字符串尾部空白字符的 TrimEnd方法:

TrimStart和TrimEnd方法

若是想去除字符串兩端其餘任意字符,能夠考慮Trim他的重載兄弟:String.Trim(Char[]),傳入你想要去除的哪些字符的數組。

源碼奉上:

public string Trim(params char[] trimChars)
{    if ((trimChars == null) || (trimChars.Length == 0))
    {
        trimChars = WhitespaceChars;
    }    return this.TrimHelper(trimChars, 2);
}

空格 != 空白字符,刪除空格請使用: Trim(‘ ‘);

相關文章
相關標籤/搜索