c#String的不變特性,可讀但不可寫性


談到字符串,大家自然覺得簡單,但是總是有一些小的問題隱約出現,下面我就系統的說一下字符串的問題,有說不到日后再予補充。

1,首先String是一個類,string只是String類的一個別名,別名的意思:另一個代號,就是和String一樣使用。

2,string str=“abc”,和char[] cha={'a','b','c'}的不同。大家不要簡單認識一個字符串就是一個字符數組。要理解本質。

就是字符串的不變性,string只是可讀,但不可寫。但字符數組可讀可寫。

可讀:字符串中的str[0]=a  str[1]=b  str[2]=c,字符中的str[0]=a  str[1]=b  str[2]=c,

可寫:字符串里的元素是不可寫的

class Program
    {
        static void Main(string[] args)
        {
            char[] cha = { 'a', 'b', 'c' };
            Console.WriteLine(cha[0]);
            cha[0] = 'b';
            Console.WriteLine(cha);

            string str = "abc";
            Console.WriteLine(str[0]);
            // str[0] = 'd';
            Console.ReadKey();
        }

若str[0]='d';將會報“錯誤 1 無法對屬性或索引器“string.this[int]”賦值 -- 它是只讀的“字符數組可以。  

這里有人提出,str=“abc”;str+=“d”,Console.WriteLine(str);出現abcd;這不是表明字符傳可以更改嗎?可寫嗎?

下面咱們就針對這個問題自習分析一下。

看到這個圖,相比大家大家明白了字符串的不變性。再來個圖證明這個不變性。

3,這里又一次證明了字符串不可變性,另外提出一個問題,那就是字符串的“暫存池”的概念。

string str=“abc”;string str1=“abc”兩者指的是同一個對象。

但是這僅僅是string str=“abc”;string str1=“abc,而不是char[] cha={'a','b','c'}; string str=new string(cha);

 

在調試的時候打開監視窗口,輸入*變量,監視變量的地址,兩者是同一地址,證明指向的同一變量。下圖不同地址,自然不同變量。

 

總結,處理字符串 一定要有接受他的返回值,因為每處理一次,就會產生一個對象。

常常將字符串實例,ToCharArray();然后再調用string的(char[])構造函數。“修改”字符串中的元素。

 

問題:這里會讓我們想到傳遞和引用傳遞的用法。以后再予更新。

4,

string str=null;

str="";

string str1=string.Empty;

string str2="";

string str3=“ ”;//有個空格

運行過str=null后,str的地址沒有變化,依然是0x00000000,所以說,沒有分配內存空間。

運行完后,如上圖顯示,證明string.Empty和“”是一樣的,當然也和先賦null,再“”一樣。但是擁有一個空格字符就不同了。

 

//string a = "abc";
//char[] ch = { 'a', 'b', 'c' };
//string a = new string(ch);
string a = "abc";
string b = a; 
b+="def";
Console.WriteLine(a);//abc //new方法得到一樣的結果
Console.WriteLine(b);//abcdef
Console.ReadKey();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM