国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

理解C#中的string類型

2024-07-21 02:19:56
字體:
來源:轉載
供稿:網友

目的

本文的目的在于揭示和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的別名,他們指向不同的內存空間。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大厂| 娄底市| 上思县| 璧山县| 宁明县| 霍林郭勒市| 光泽县| 青铜峡市| 普安县| 泰来县| 安远县| 历史| 广元市| 岗巴县| 敦煌市| 雅安市| 通山县| 莱西市| 江孜县| 息烽县| 绍兴县| 宜兰市| 丘北县| 岱山县| 得荣县| 闵行区| 阿拉善右旗| 宣化县| 雅安市| 达孜县| 隆昌县| 广饶县| 邯郸县| 二连浩特市| 伊通| 泌阳县| 北川| 柳河县| 岳西县| 东安县| 禄劝|