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

談到字符串,你們天然以爲簡單,可是老是有一些小的問題隱約出現,下面我就係統的說一下字符串的問題,有說不到往後再予補充。

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

2,string str=「abc」,和char[] cha={'a','b','c'}的不一樣。你們不要簡單認識一個字符串就是一個字符數組。要理解本質。函數

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

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

可寫:字符串裏的元素是不可寫的spa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;這不是代表字符傳能夠更改嗎?可寫嗎?code

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

看到這個圖,相比你們你們明白了字符串的不變性。再來個圖證實這個不變性。blog

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();
複製代碼

 

知識沒有高低貴賤之分。
相關文章
相關標籤/搜索