C#掃盲之:String字符串的經常使用方法和冷知識

前言

字符串對於任何編程語言都是必須操做和了解的,由於在實際編程中,任何項目和工程都必需要處理字符串數據,文件路徑、提示消息,文本的處理等等,而在使用過程當中不少人都是沒有系統的瞭解,大量使用string,其實string的大量使用會形成很大的性能消耗,這跟.NET平臺對字符串的處理有很大的關係,而.NET對字符串的支持仍是很豐富的。無論是面試亦或者是實際編程使用,總結一下知識頗有必要。面試

1.使用字符串數據

String提供了大量不少工具類,包括返回字符串長度、查找當前字符串中的字符串、轉換大小寫等方法,下圖是String部分重要定成員編程

屬性/方法 描述
Length  獲取當前 System.String 對象中的字符數
Compare() 比較兩個指定的 System.String 對象,返回一個整數標識兩者之間的大小
Concat() 鏈接字符串
Contains() 判斷當前字符串是否包含指定的一組字符串
Equals() 判斷字符串是否與指定的字符串相等
Format() 格式化字符串
Insert() 插入字符串
PadLeft()
PadRight()
向左填充/向右填充
Remove() 從指定位置移除字符串
Replace() 替換指定支付爲新對象
Split() 返回當前字符串由指定分割符分割的數組
StartsWith() 判斷當前字符串是否由指定字符開始
Substring() 提取當前字符串的子字符串
ToCharArray() 轉換成字符數組

ToLower()
ToUpper()windows

將當前字符串所有轉換成小寫/大寫
Trim() 移除當前字符串頭部和尾部所出現的自定字符,默認空格

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上就是幾個比較重要的函數,有些是string類全部,有些是string對象全部數組

2.基本字符串操做

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string tmpStr = "you just come on,girl";
            Printf(tmpStr.Length);             //獲取字符串長度
            Printf(string.Compare("123", "12"));//比較

            string str1 = "hehe";
            string str2 = "haha";
            Printf(str1 + str2);
            Printf(string.Concat(str1, str2));//字符串拼接

            Printf(tmpStr.Contains("just")); //包含關係
            Printf("123".Equals("123_"));    //相等性
            Printf(string.Format("{0} is great?but the {2} doesn't agree with{1}.", "xiaoMing", "xiaoHua", "her"));//格式化

            tmpStr.Insert(3, "insert");      //從字符3位置插入字符串"insert"
            Printf(tmpStr);

            string intStr = "5";
            Printf(intStr.PadLeft(2, '0'));  //設置字符串總長度未2,若原字符串長度不足則自動填'0'
            Printf(intStr.PadLeft(1, '0'));  //若字符串原長度超過2,則返回原字符串

            string removeStr = "ha123hahhahhah12313";
            removeStr.Remove(2, 5);            //移除(從第3個字符串開始移除5個字符)
            Printf(removeStr);

            string replaceStr = "xioaming";
            replaceStr.Replace('o', 'M');      //替換(將源字符串中o替換成M)

            string splitStr = "xiaoming,xiaohua,xiaocao_xiaomao";
            string[] splitArry = splitStr.Split(',', '_');//指定分割字符,分割源字符串返回字符串數組
            foreach (string tmpstring in splitArry)
            {
                Console.Write(tmpstring + "");
            }
            string startStr = "heihieie";
            bool isStartCondition = startStr.StartsWith("he", StringComparison.OrdinalIgnoreCase);//判斷是否以字符串是否以「he」開始,並設置條件是按排序規則忽略大小寫
            bool isStart = startStr.StartsWith("he");
            Printf(isStartCondition);
            Printf(isStart);

            string subStr = "12341234xiangshouge";
            Printf(subStr.Substring(10, 2));   //從第11個字符開始獲取2個字符,

            char[] charArry = subStr.ToCharArray();//轉換成字符串
            Printf(charArry.ToString());

            string lowerStr = "xiaoming";
            Printf(lowerStr.ToUpper());         //轉換成大寫
            string uperStr="XIAOMINGHEHEDA";
            Printf(uperStr.ToLower());          //轉換成小寫

            string trimStr = " _123_heheda, ";
            Printf(trimStr.Trim());             //去除字符串首尾空格,默認
            Printf(trimStr.Trim(','));

            Printf(trimStr.TrimStart(' ','_')); //去除字符串首部的空格和下劃線
            Printf(trimStr.TrimEnd(' ',','));       //去除字符串尾部,號

            Console.ReadKey();
        }

        /// <summary>
        /// 打印函數
        /// </summary>
        static void Printf(object str)
        {
            Console.WriteLine(str.ToString());
        }
        static void Printf(int str)
        {
            Console.WriteLine(str.ToString());
        }
    }
}
View Code

輸出:網絡

3.轉義字符

C#字符串字面量中能夠包含各類轉義字符,用來限制字符數據在輸出流中的格式,轉義字符爲反斜槓\,常見轉義字符編程語言

字符 做用
\'  在字符串中標識單引號
\"  在字符串中標識雙引號
\\  在字符串中標識\(經常使用於定義網絡和文件路徑)
\a  觸發一個系統警報(蜂鳴)
\n  換行(windows平臺上有效)
\r  回車
\t  水平製表符

 

 

 

 

 

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Printf("hahhehha \a");
            Printf("C:\\heheda\bing");
            Printf("1234\n\n\n");//添加三個空行
            Printf("1231\t1231");

            Console.ReadKey();
        }

        /// <summary>
        /// 打印函數
        /// </summary>
        static void Printf(object str)
        {
            Console.WriteLine(str.ToString());
        }
        static void Printf(int str)
        {
            Console.WriteLine(str.ToString());
        }
    }
}
View Code

輸出:ide

 

4.字符串的恆定性及性能影響

 在.NET中,一旦將初始值賦給字符串對象,字符數據就不會改變了,不仔細瞭解還很疑惑,其實全部對string類型的方法操做都是返回一個新的字符串對象,因此這也就是爲何不能大量使用string類型的緣由,特別是在考慮性能的程序和項目中,更應該注意減小使用string類型。函數

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //設置初始字符串值
            string s1 = "this is my stringtest";
            Console.WriteLine("s1 is={0}", s1);

            //大寫s1
            string UperStr = s1.ToUpper();
            Console.WriteLine("UperStr is={0}", UperStr);

            Console.WriteLine("s1 is={0}", s1);//s1是大寫仍是小寫呢?此處s1仍是原來的值
            Console.WriteLine("s1內存地址是否與s1.touper以後的內存地址相等:{0}", string.ReferenceEquals(s1, s1.ToUpper()));

            Console.ReadKey();
        }
    }
}
View Code

輸出:工具

能夠看到二者的內存引用控件並不相同,產生了新字符串。性能

 字符串恆定性對性能影響分析:

class Program
    {
        static void Main(string[] args)
        {
            //設置初始字符串值
            string s1 = "this is my stringtest";
            s1 = "my seconde string test";

            Console.ReadKey();
        }
    }

使用ILDasm.exe查看編譯後的CIL代碼以下:

經過產看CIL代碼能夠看到程序屢次使用ldstr操做碼,它表示的是加載字符串,也就是在託管堆上申請空間並分配值,s1再被從新賦值時,舊的臨時字符串"this is my stringtest「就會失效,s1指向了新的引用"my seconde string test",而1處支付串最終會被GC管理器回收。這種字符串在也就是說在程序中若存在多個不一樣的字符串,則會進行屢次加載,大量的使用string類型將會變得低效,並致使代碼膨脹,特別是進行字符串拼接的時候,這是由於編譯器在編譯寫元數據時候回屢次加載不一樣的字符串常量。

因此在大量處理文本數據的時候,建議使用StringBulder操做字符串,由於StringBulder對象直接在內存對象上對字符串對象進行修改,這樣不會產生新的副本,使程序變得高效,StringBulder的詳細討論,本文暫時擱置。

因爲本人才學識淺,描述不免紕漏,若有錯誤,歡迎指出。麼麼!

相關文章
相關標籤/搜索