六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

理解C#中的string分類

[摘要]目的 本文的目的在于揭示和DOTNET及C#相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string數據類型有關,string數據類型是一種引用類型,但是當和其他引用類型比較的時候,很多開發人員可能并不能完全理解它的行為。 問題 對于常見的引用類...

       目的

       本文的目的在于揭示和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的別名,他們指向不同的內存空間。




主站蜘蛛池模板: 天天爱天天操天天射 | 一级做α爰片久久毛片 | 亚洲精品456| 婷婷色香五月激情综合2020 | 日本视频在线观看播放免费 | 青青青草视频 | 五月婷六月婷婷 | 日韩小视频网站 | 全黄性高视频 | 日本最新免费二区三区 | 五月天丁香婷婷综合 | 日韩美女黄大片在线观看 | 特黄视频免费看 | 日本aⅴ在线观看 | 色狠狠干| 日韩乱轮 | 亚洲成人福利网站 | 青青青亚洲精品国产 | 野草影院手机在线观看免费6 | 亚洲欧美中文日韩在线v日本 | 人人精品 | 五月婷中文字幕 | 天天干天天拍天天操 | 日本三级视频在线播放 | 青青青在线视频 | 日韩在线 中文字幕 | 色噜噜亚洲 | 亚洲精品国产v片在线观看 亚洲精品高清在线观看 | 色在线播放| 日韩一区二区三区不卡 | 天天天干干干 | 青草娱乐视频 | 日本在线视频网址 | 亚洲伦理片 | 日本一区二区三区四区无限 | 最新精品亚洲成a人在线观看 | 天天干天天拍天天射天天添天天爱 | 亚欧日韩毛片在线看免费网站 | 日本热久久 | 小草青青免费影视观看 | 中文字幕色在线 |