目的<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
本文的目的在於揭示和
dotnet及c#
string
資料型別有關
,string
資料型別是一種引用型別
,但是當和其他引用型別比較的時候
,很多開發人員可能並不能完全理解它的行為。
問題
對於常見的引用型別
,當改變乙個物件別名的值時
,這種變化也同樣會在乙個實際的物件中表現出來
;反之亦然。但是對於
string型別,
似乎不是這樣的。
解釋
引用型別
假設我們有乙個類
mytype,
這個類有乙個屬性
name;
我們還有乙個類
這個類提供
main()
方法來執行這個程式。
下面,我們來看看**:
using
system;
class
mytype
get}
}class
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
get}
}class
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;
class
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資料型別是一種引用型別,但是當和其他引用型別比較的時候,很多開發人員可能並不能完全理解它的行為。問題對於常見的引用型別,當改變乙個物件別名的值時,這種變化也同樣會...