目的 本文的目的在於揭示和dotnet及c#相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string資料型別有關,string資料型別是一種引用型別,但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。
問題對於常見的引用型別,當改變乙個物件別名的值時,這種變化也同樣會在乙個實際的物件中表現出來;反之亦然。但是對於string型別,似乎不是這樣的。
解釋引用型別
下面,我們來看看**:
using system;
class mytype
private string name;
public string name
setname=value;
getreturn name;
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= and obj2=",obj1.name,obj2.name);
obj1.name="ahmed";
console.writeline("values of obj1= and obj2=",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
setname=value;
getreturn name;
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= and obj2=",obj1.name,obj2.name);
obj1.name="ahmed";
console.writeline("values of obj1= and obj2=",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;
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= and obj2=",obj1,obj2);
obj1="ahmed";
console.writeline("values of obj1= and obj2=",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的別名,他們指向不同的記憶體空間。
理解C 中的string型別
本文的目的在於揭示和dotnet及c 相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string資料型別有關,string資料型別是一種引用型別,但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題對於常見的引用型別,當改變乙個物件別名的值時,這種變化也同樣會在...
理解C 中的string型別
目的 本文的目的在於揭示和dotnet及c 相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string 資料型別有關,string 資料型別是一種引用型別 但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題 對於常見的引用型別 當改變乙個物件別名的值時,這種變...
理解C 中的string型別
目的 本文的目的在於揭示和dot 及c 相關的一些常見的和不常見的問題。在這些問題中我的第一篇文章和string資料型別有關,string資料型別是一種引用型別,但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題對於常見的引用型別,當改變乙個物件別名的值時,這種變化也同樣會...