1樓:匿名使用者
1.值型別的資料儲存在記憶體的棧中;引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的位址。
2.值型別訪問速度快,引用型別訪問速度慢。
3.值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用
4.值型別繼承自system.valuetype,引用型別繼承自system.object
5.棧的記憶體分配是自動釋放;而堆在.net中會有gc來釋放
c#中基本資料型別是值型別,結構也是值型別。而陣列、類、介面、字串都是引用型別。
通俗點講值型別就是現金;引用型別就是存摺。
2樓:匿名使用者
值型別:
單元直接存放「有效值」
如:int a=3;
則a記憶體單元就放的是3
引用型別:
單元放的是另外乙個物件的引用(位址)
如:form form1=new form();
就是說,在記憶體中開闢了乙個物件new form(),form1記憶體單元存放的是那個物件的位址,並非物件本身
3樓:
給你個**你去看看吧
c#中值型別和引用型別的區別
4樓:大野瘦子
1、速度上的區別
值型別訪問速度快,引用型別訪問速度慢。
2、用途上的區別
值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用。
3、**上的區別
值型別繼承自system.valuetype,引用型別繼承自system.object
4、位置上的區別
值型別的資料儲存在記憶體的棧中,引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的位址。
5、型別上的區別
值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。
6、儲存位置上的區別
值型別變數直接把變數的值儲存在堆疊中,引用型別的變數把實際資料的位址儲存在堆疊中,而實際資料則儲存在堆中。
例如:字串型別,而堆疊則用於儲存固定長度的資料,如整型型別的資料int(每個int變數占用四個位元組)。
由資料儲存的位置可以得知,當把乙個值變數賦給另乙個值變數時,會在堆疊中儲存兩個完全相同的值;而把乙個引用變數賦給另乙個引用變數,則會在堆疊中儲存對同乙個堆位置的兩個引用,即在堆疊中儲存的是同乙個堆的位址。
在進行資料操作時,對於值型別,由於每個變數都有自己的值,因此對乙個變數的操作不會影響到其它變數;對於引用型別的變數,對乙個變數的資料進行操作就是對這個變數在堆中的資料進行操作,
如果兩個引用型別的變數引用同乙個物件,實際含義就是它們在堆疊中儲存的堆的位址相同,因此對乙個變數的操作就會影響到引用同乙個物件的另乙個變數。
5樓:風琬鈕若雲
1值型別。
定義時只有型別和變數名。沒有&符號的為值型別。表示本身的值。有自己的記憶體空間。可以不做初始化。
2引用型別。
定義時,型別
&變數名=另乙個變數名。
表示引用。自身沒有記憶體空間,使用初始化時的變數空間。是另乙個變數名的乙個別名。
引用在定義時必須初始化。
6樓:匿名使用者
每乙個值型別都有乙個獨立的記憶體區域儲存自己的值,呼叫它的時候呼叫的是他的值,而應用型別呼叫的是記憶體中的位址。
比如a1=18,這時候在記憶體中儲存的是18,當把a1賦值給a2的時候,他們兩個引用的是同乙個記憶體空間,a2的值會儲存為a1的值,當把a2改為20後,因為a1和a2引用的是同乙個記憶體位址,所以a1也變成20,這是引用型別。
值型別是當把a1賦值給a2時,會為a2再開一塊新的記憶體空間儲存a1的值。當把a2改成20時,只會在a2的空間儲存20,和a1沒關係了。
7樓:森振華星戊
你得到的結果還是一樣的確良20
和20student3.age
=18;
--->age=18;
student4
=student3;
--->student4=18;
student4.age
=20;
--->student4=20;
--->age=20先前那個age被替了
----->20,20
8樓:潮佑平衡鶯
值型別都是深拷貝,就是把記憶體中的資料賦值給另一快記憶體。
引用型別都是淺拷貝,就是被指向一塊記憶體的位址拷貝給了另乙個引用。
值型別用=是值傳遞
會在記憶體中在開闢一塊新的記憶體,
比如inta=
1;intb=
a;記憶體中就開了2快記憶體分別是a和b,結構也是值型別所以沒問題。問題在於類,如果你沒有寫「=」號賦值運算子,那麼student3
=student4;讓student3也指向student4的記憶體,然後你再給student4這塊記憶體賦值20
那麼student3就也等於20了。而且classstudentstudent3
=new
classstudent();這塊記憶體,如果沒有.net的垃圾**的話,在c++中就是記憶體洩露了。
9樓:匿名使用者
不知道你學過c沒有,演過c的話就很好理解這個問題,引用相當於你在c裡面使用指標,
如:寫乙個函式的時候
public int fuction1(ref int a,ret int b)
public static main()
當你在function1中間把a,b變數的值改變後,main函式裡面的a,b 值也就改變了
成了a=2,b=3了
10樓:匿名使用者
它們的區別在於使用的記憶體位置不同:值型別資料儲存在棧上,而引用型別資料儲存在堆上。
值型別直接包含值,換言之,變數引用的位置就是值在記憶體中實際儲存的位置。
引用型別並不直接儲存值,它們儲存的是對乙個記憶體位置的引用(記憶體位址),要去那個位置才能找到真正的資料。
------------------《c#本質論》(essential c# 2.0)
c#中 怎樣區分值型別和引用型別
11樓:匿名使用者
個人的理解,大部分能new的,就是引用型別,不能new的。。。差不多就是值型別了。但是結構可以new的- -、還有一些基本型別,數字的基本是值型別,string是引用的。。。
開頭大寫的基本上是引用的。。。你只要記住特殊的一些情況就可以了。。。說實在的,在最初的學習中,區分值和引用,沒什麼太大意義。。。
以後會用些用
12樓:匿名使用者
在堆疊的角度,值型別是分配在 棧裡的,引用型別 在棧引用位址,在堆中生成初始化。基本上說繼承於 system.value的都是 值型別,如 數值int 、float,結構體 struct等;引用型別包括類、介面、委託和裝箱值型別等。
像樓上說的:初學時,區分值和引用,沒什麼太大意義。學到後面 的注重效率和優化 ,尤其是在 裝箱 和拆箱 中 要注意建立的變數是引用型別還是值型別的。
13樓:匿名使用者
類是引用型別結構和列舉是值型別
c#中值型別和引用型別的區別
14樓:郗鑠牢初
晦澀難懂的概念呢,他們都講了,我就不講了。就講乙個核心的在你程式設計生涯中最先要體驗到的乙個區別:
把乙個值型別的變數賦給另外乙個值型別的變數,那麼改變二者中的任何乙個,另外乙個不會被改變;
而引用型別則不同,如果把乙個引用型別的變數賦給另外乙個引用型別的變數,那麼改變其中任何乙個,另外乙個也同樣被改變。
至於導致這個區別的原因,就是他們所說的那些……
c#使用值型別引數和引用型別引數區別
15樓:匿名使用者
值型別最好理解,沒有使用ref,所
以修改肯定不會保留;
參考微軟說明:內
最好自己寫個例子測試下容
16樓:陽光的雷咩咩
值型別傳參是把值複製了乙份。
c#值型別和引用型別的區別
17樓:匿名使用者
如果你學過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#中引用型別都是類:
C中String到底是引用型別還是值型別?很疑惑為什麼書上說的都自相矛盾啊
對於新建.net框架的string類時,net的各個語言是必須用類似 string s new string string類屬於.net框架 但c 語言環境下定義了小寫的string 作為string類的別名 作為語言組成部分的關鍵字 也定義了 abc 作為字串的表現法。都不同於新建物件的語法。st...
c指標引用型別
1全部代表乙個指向指標型別的指標。就是說temp這個指標是指向乙個指向int型別的指標。這樣說你可能不好理解。如 乙個二維陣列,int a 3 4 其中陣列名a的性質就類似於int temp。我們知道陣列名就是乙個指標,指向陣列的首位址。二維陣列可以看成是由多個一維陣列組成。a 0 就是第一行的指標...
關於c的兩個值型別的ReferenceEquals方法的結果的疑惑
請注意 object.referenceequals 是判斷兩個引用型別的變數 是否引用同乙個例項 int.referenceequals 實際上是繼承了 object.referenceequals 該方法定義如下 public static bool referenceequals object...
關於c 列舉型別的宣告,C 中列舉型別的使用???
enum weekday 則可以定義 weekday first first即為代表星期的變數 這個列舉,繼承方式,我去找找例子。列舉應該不能這樣使用,因為列舉本來就是乙個固定的常量陣列,也就是說是乙個非常確定的資料的情況下,才用列舉的。再說,即使按你說的能實現,但是列舉裡面的常量都是固定值,你在s...
C 程式設計的資料型別問題,c語言的資料型別
include include using namespace std void main for int i 0 i輸入資料時每個資料以空格或回車隔開,輸入乙個以字母 q 開頭的字串結束輸入。第一步簡單 直接用if語句判斷那個數是否為其他3種型別,符合則直接轉換成整形,否不處理就ok,你試下。c語...