理解C#中的string類型

來源:互聯網
上載者:User
本文的目的在於揭示和DOTNET及C#相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string資料類型有關,string資料類型是一種參考型別,但是當和其他參考型別比較的時候,很多開發人員可能並不能完全理解它的行為。

       問題

       對於常見的參考型別,當改變一個對象別名的值時,這種變化也同樣會在一個實際的對象中表現出來;反之亦然。但是對於string類型,似乎不是這樣的。

       解釋

       參考型別

       假設我們有一個類MyType,這個類有一個屬性Name;我們還有一個類AppType,這個類提供Main()方法來運行這個程式。

       下面,我們來看看代碼:

      

using System;

class MyType

{

     private string name;

     public string Name

     {

         set

         {

              name=value;

         }

         get

         {

              return name;

         }

     }

}

class AppType

{

     public static void Main()

     {

         MyType obj1,obj2;

         Console.WriteLine("*****Learning reference Philosophy*****");

         obj2=new MyType();

         obj2.Name="Sadiq";

         obj1=obj2;

         Console.WriteLine("values of obj1={0} and obj2={1}",obj1.Name,obj2.Name);

         obj1.Name="Ahmed";

         Console.WriteLine("values of obj1={0} and obj2={1}",obj1.Name,obj2.Name);

     }

}
 

       當你編譯並且運行這段代碼時,你將得到如下輸出:

*****Learning reference philosophy*****
values of obj1=Sadiq and obj2=Sadiq
values of obj1=Ahmed and obj2=Ahmed

這表明obj1不過是obj2的別名,換句話說,obj1和obj2都指向同一個記憶體空間。

實值型別

和上面的代碼差不多,不同的是這次我們將MyType定義為類,其他部分都相同,我們先看看代碼:

using System;

struct MyType

{

     private string name;

     public string Name

     {

         set

         {

              name=value;

         }

         get

         {

              return name;

         }

     }

}

class AppType

{

     public static void Main()

     {

         MyType obj1,obj2;

         Console.WriteLine("*****Learning reference Philosophy*****");

         obj2=new MyType();

         obj2.Name="Sadiq";

         obj1=obj2;

         Console.WriteLine("values of obj1={0} and obj2={1}",obj1.Name,obj2.Name);

         obj1.Name="Ahmed";

         Console.WriteLine("values of obj1={0} and obj2={1}",obj1.Name,obj2.Name);

     }

}
 

       我們再來看看上面代碼運行後的輸出:

*****Learning reference philosophy*****
values of obj1=Sadiq and obj2=Sadiq
values of obj1=Ahmed and obj2=Sadiq

這表明obj1和obj2並不相同,也就是說,他們指向不同的記憶體空間。

參考型別還是實值型別?
現在,讓我們看看直接使用string類型的情況:

using System;

class AppType

{

     public static void Main()

     {

         String obj1,obj2;

         Console.WriteLine("*****Learning reference philosophy*****");

         //No need of it

         //obj2=new MyType();

         obj2="Sadiq";

         obj1=obj2;

         Console. WriteLine("values of obj1={0} and obj2={1}",obj1,obj2);

         obj1="Ahmed";

         Console.WriteLine("values of obj1={0} and obj2={1}",obj1,obj2);

     }

}
 

當你運行這段代碼,你會得到:

*****Learning reference philosophy*****
values of obj1=Sadiq and obj2=Sadiq
values of obj1=Ahmed and obj2=Sadiq

這表明obj1並不是obj2的別名,即obj1和obj2指向不同的記憶體空間。

非常奇怪!確實!我們都知道string類型是動態增長的,這表明它必須在堆上分配記憶體。我們都知道參考型別都在堆上分配記憶體,那麼string類型也應該是參考型別,那麼為何它又表現出和實值型別一樣的性質呢?

原因
關鍵在於如下的兩行代碼中:

string obj1;
obj1 = “value forces to allocate a memory”;

第一行代碼僅僅是定義了一個對象,並不會建立一個對象;第二行代碼才會真正建立一個對象。這意味著你也可以將第二行代碼寫成:

obj=new string(“value forces to allocate a memory”);.

總結

因此,當你初始化一個string對象的值或是賦予一個新的字串給它的時候都將在記憶體中建立一個新的對象。現在,我們應該明白了第三個例子中的obj1並不是obj2的別名,他們指向不同的記憶體空間。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.