1樓:匿名使用者
區別:1、值型別通常被分配在棧上,它的變數直接包含變數的例項,使用效率比較高。
2、引用型別分配在託管堆上,引用型別的變數通常包含乙個指向例項的指標,變數通過該指標來引用例項。
3、值型別繼承自valuetype(注意:而system.valuetype又繼承自system.
object);而引用型別繼承自system.object。 4、值型別變數包含其實例資料,每個變數儲存了其本身的資料拷貝(副本),因此在預設情況下,值型別的引數傳遞不會影響引數本身;而引用型別變數儲存了其資料的引用位址,因此以引用方式進行引數傳遞時會影響到引數本身,因為兩個變數會引用了記憶體中的同一塊位址。
5、值型別有兩種表示:裝箱與拆箱;引用型別只有裝箱一種形式。我會在下節以專門的篇幅來深入討論這個話題。
6、典型的值型別為:struct,enum以及大量的內建值型別;而能稱為類的都可以說是引用型別。
7、值型別的記憶體不由gc(垃圾**,gabage collection)控制,作用域結束時,值型別會自行釋放,減少了託管堆的壓力,因此具有效能上的優勢。例如,通常struct比class更高效;而引用型別的記憶體**,由gc來完成,微軟甚至建議使用者最好不要自行釋放記憶體。
8、值型別是密封的(sealed),因此值型別不能作為其他任何型別的基類,但是可以單繼承或者多繼承介面;而引用型別一般都有繼承性。
9、值型別不具有多型性;而引用型別有多型性。
10、值型別變數不可為null值,值型別都會自行初始化為0值;而引用型別變數預設情況下,建立為null值,表示沒有指向任何託管堆的引用位址。對值為null的引用型別的任何操作,都會丟擲nullreferenceexception異常。
11、值型別有兩種狀態:裝箱和未裝箱,執行庫提供了所有值型別的已裝箱形式;而引用型別通常只有一種形式:裝箱。
2樓:中公教育it培訓優就業
1)值型別儲存在記憶體棧中,引用型別資料儲存在記憶體堆中,而記憶體單元中存放的是堆中存放的位址。
2)值型別訪問快,引用型別訪問慢。
3)值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標和引用。
4)棧的記憶體是自動釋放的,堆記憶體是.net中會由gc來自動釋放。
5)值型別繼承自system.valuetype,引用型別繼承自system.object。
「值型別」和「引用型別」的區別是什麼?
3樓:匿名使用者
1, 值型別儲存的是具體的值。
例如int a = 1;
int b = a;
b++;
這時b為2,a仍然是1
,2, 引用型別儲存的是值的位址。
例如有個型別是 user
user u1 = new user();
user u2 = u1;
u2.name = "李四";
這時 u2 和 u1 的名字都為李四,因為 u2=u1的時候,u1和u2將指向同乙個記憶體中的位址。改變u2的等於改變了u1,
值型別(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為值型別。值型別變數宣告後,不管是否已經賦值,編譯器為其分配記憶體。
引用型別(reference type):string 和 class統稱為引用型別。當宣告乙個類時,只在棧中分配一小片記憶體用於容納乙個位址,而此時並沒有為其分配堆上的記憶體空間。
當使用 new 建立乙個類的例項時,分配堆上的空間,並把堆上空間的位址儲存到棧上分配的小片空間中。
c#值型別和引用型別的區別
4樓:匿名使用者
如果你學過c/c++的話,這點很容易理解,c#中的乙個重要特徵就是所有一切資源都可以抽象為類,並可例項化物件,包括基本資料型別,所有一切類的基類是object,因此c#是完全物件導向的語言。
在c/c++中,「int,byte,long,bool,char ..."這些型別雖然不是真正意義上的類,但是從某種角度看,其實也具有類的某些特徵,比如你可以把int看做編譯器內建的乙個類,當你int a進行定義變數時,等於用int類建立了乙個稱作a的物件,只是c#告訴你,int就是個類,它有自己的方法和屬性,比如tostring(),而且所有的型別都繼承於object類,而c/c++中沒有這麼徹底。
c/c++中,你可以直接用基本變數型別建立乙個變數,變數名指代乙個系統分配的位址,當使用變數名操作時可以直接運算元據,因此這種型別可以叫做值型別,只不過由於c/c++中根本沒把基本型別表示為類所以也沒有值型別這種表述,直接定義變數時,變數被分配在棧上,叫做靜態分配。而當我們在定義乙個指標變數時,比如100個元素的動態陣列: int *p=new int[100],或者動態分配乙個變數並初始化:
int *p=new int(10),都是在程式執行時分配到堆上面的,並且把位址賦值給指標p。
說這些c/c++的概念是想告訴你,c#中的值型別和引用型別就是和c/c++靜態分配和動態分配是一樣的。c#中的值型別,它可以定義後直接使用(不需要new,沒有指標),分配在棧上;引用型別其實就是將指標和所指記憶體塊以及其他額外資料封裝了,因為在c#中全面物件化,對使用者不可見。但是本質還是一樣的,因此值型別( int a=10 ) 就是直接進行分配記憶體後儲存,而引用型別必須進行裝箱:
object o=10,裝箱的過程就是在堆上分配乙個記憶體塊,存放a的值以及其他額外資料並返回位址,也就是物件的引用賦值給o,而你是不可以直接將o按指標來操作的(所以稱為引用)。由於基本型別是內建的,所以這類物件的建立不需要顯式去new,當然你一定要自己new也不會錯 object o=new int(),因為c#是完全物件導向的,一切的實體都可以new,建立格式標準化的(除了介面,因為它沒有實體)。
最後說說值型別,由於c#一切都是物件導向的,因此就算是值型別也是個類,因此基本型別公升級後c/c++中很簡單變數公升級為結構,以滿足物件導向統一介面,因為c/c++中類的本質就是結構的公升級版(增加了函式),而c#中的值型別的存在為了效率,所以採用靜態結構體。雖然這兩種語言是完全不同的語言,但是血緣上還是有關係的,有些地方可以互通和借鑑,這個可以幫助我們方便的理解和學習。
下圖為vs2010 c#中 右鍵查int型別的定義,注意是struct,值型別,結構的特點就是靜態和效率,所以c#中基本型別都是結構:
下圖為vs2010 c#中 右鍵查object型別的定義,注意是class,其特點就是動態和靈活,所以c#中引用型別都是類:
5樓:
1. 值型別的資料儲存在記憶體的棧中;引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的
位址。2. 值型別訪問速度快,引用型別訪問速度慢。
3. 值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用
4. 值型別繼承自system.valuetype,引用型別繼承自system.object
5. 棧的記憶體分配是自動釋放;而堆在.net中會有gc來釋放
6. 值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。
7. 值型別變數直接把變數的值儲存在堆疊中,引用型別的變數把實際資料的位址儲存在堆疊中,而實際
資料則儲存在堆中。注意,堆和堆疊是兩個不同的概念,在記憶體中的儲存位置也不相同,堆一般用於儲存
可變長度的資料,如字串型別;而堆疊則用於儲存固定長度的資料,如整型型別的資料int(每個int變數
佔用四個位元組)。由資料儲存的位置可以得知,當把乙個值變數賦給另乙個值變數時,會在堆疊中儲存兩
個完全相同的值;而把乙個引用變數賦給另乙個引用變數,則會在堆疊中儲存對同乙個堆位置的兩個引用
,即在堆疊中儲存的是同乙個堆的位址。在進行資料操作時,對於值型別,由於每個變數都有自己的值,
因此對乙個變數的操作不會影響到其它變數;對於引用型別的變數,對乙個變數的資料進行操作就是對這
個變數在堆中的資料進行操作,如果兩個引用型別的變數引用同乙個物件,實際含義就是它們在堆疊中保
存的堆的位址相同,因此對乙個變數的操作就會影響到引用同乙個物件的另乙個變數。
值型別和引用型別的區別?
6樓:青鳥中關村專家
在定義string型別的變數時,有兩種方式:
1、string name = "tom"; 這種定義方式就是值型別
2、string name = new string("tom"); 這種就按照引用型別來做
7樓:
這幾天怎麼有人會問這個?說深了吧,非專業的不懂,不深吧,他們又不明白所以然!
給你兩個位址你去看看吧。
這兩個涉及很多的值型別與引用型別的術語!
8樓:du瓶邪
值型別就是現金,要用直接用;引用型別是存摺,要用還得先去銀行取現。
宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址,這就像您的銀行賬號一樣。
具體哪些型別是值型別哪些是引用型別,大家翻翻書,背一背就好了,不過我想,做過一段時間的開發,即使您背不了書上教條的定義,也不會把值型別和引用型別搞混的。
9樓:允憶楓
c# 支援兩種型別:「值型別」和「引用型別」。
值型別(如 char、int 和 float)、列舉型別和結構型別。
引用型別包括類 (class) 型別、介面型別、委託型別和陣列型別。
值型別與引用型別的區別在於值型別的變數直接包含其資料,而引用型別的變數則儲存物件引用。對於引用型別,兩個變數可能引用同乙個對
象,因此對乙個變數的操作可能影響另乙個變數所引用的物件。對於值型別,每個變數都有自己的資料副本,對乙個變數的操作不可能影響另乙個變數
值型別和引用型別的區別是什麼
1 不同的儲存物件 值型別變數儲存的是變數的值,直接儲存在棧記憶體中。引用型別變數儲存的是變數所在的記憶體位址,引用型別變數的實際資料儲存於託管堆,變數本身僅僅是乙個指向堆中實際資料的位址,儲存於棧記憶體中,通常是四個位元組。2 不同的儲存位置 引用型別reference儲存在託管堆上。棧的記憶體是...
引用型別傳遞與值傳遞,什麼是值傳遞和引用傳遞
在c 中,有兩種型別 引用型別 如 string 和非引用型別 如 int 引用型別指向的其實是乙個記憶體位址,string 雖然是引用型別 不過是不可變的。對字串做一些操作 比如大小寫的轉換 實際上是重新建立了乙個字串。這也是為什麼在做大量字串拼接的時候要使用stringbuilder 而不用 如...
c中值型別和引用型別的區別
1 速度上的區別 值型別訪問速度快,引用型別訪問速度慢。2 用途上的區別 值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用。3 上的區別 值型別繼承自system.valuetype,引用型別繼承自system.object 4 位置上的區別 值型別的資料儲存在記憶體的棧中,引...