c值型別和引用型別的區別,c 中值型別和引用型別的區別

時間 2022-10-28 18:16:49

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語...