欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

C#教程

當(dāng)前位置:主頁(yè) > 軟件編程 > C#教程 >

淺談C#中的值類型和引用類型

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊: 次

一、基本概念

C#只有兩種數(shù)據(jù)類型:值類型和引用類型

值類型在線程棧分配空間,引用類型在托管堆分配空間

值類型轉(zhuǎn)為引用類型稱成為裝箱,引用類型轉(zhuǎn)為值類型稱為拆箱

以下是值類型和引用類型對(duì)照表

從上圖可以簡(jiǎn)單看出:string,Object,數(shù)組,class是引用類型,簡(jiǎn)單類型,枚舉,結(jié)構(gòu)是值類型。

二、代碼展示

定義一個(gè)類和結(jié)構(gòu)調(diào)用賦值

內(nèi)存分配情況如下圖:

從這張圖可以看出,class實(shí)例化出來(lái)的對(duì)象,指向了內(nèi)存堆中分配的空間;truct實(shí)例化出來(lái)的對(duì)象,是在內(nèi)存棧中分配。

修改代碼如下:

內(nèi)存分配情況:

由上圖可以知:

復(fù)制代碼 代碼如下:

object obj=”abc”;
string i=(string)obj;

值類型和引用類型儲(chǔ)的位置不一樣
如果是引用類型,當(dāng)兩個(gè)對(duì)象指向同一個(gè)地方,修改某一個(gè)的時(shí)候,其它對(duì)象的值會(huì)發(fā)生改變

using System;

namespace ConsoleApplication2
{
  //引用類型(因?yàn)椤甤lass')
  public class SomeRef
  {
    public int x { get; set; }
  }
  //值類型(因?yàn)椤畇truct')
  public struct SomeVal
  {
    public int x{ get; set; }
  }

  class Program
  {
    static void Main(string[] args)
    {
      SomeRef r1=new SomeRef(); //在堆上分配
      SomeVal v1 = new SomeVal();//在棧上分配
      r1.x = 5;    //提領(lǐng)指針
      v1.x = 5;    //在棧上修改
      Console.WriteLine(r1.x); //顯示5 
      Console.WriteLine(v1.x); //顯示5

      SomeRef r2 =r1; //只復(fù)制引用(指針)
      SomeVal v2 =v1; //在棧上分配并賦值成員
      r1.x = 8;    //r1.x和r2.x都會(huì)修改
      v1.x = 8;    //v1.x會(huì)更改,v2.x不會(huì)

      Console.WriteLine(r1.x); //顯示8 
      Console.WriteLine(r2.x); //顯示8 
      Console.WriteLine(v1.x); //顯示8
      Console.WriteLine(v2.x); //顯示5

      Console.ReadKey();
    }
  }
}

三、值類型裝箱、拆箱

1、裝箱:就是將值類型的數(shù)據(jù)打包到引用類型的實(shí)例中(比如將string類型的值abc賦給object對(duì)象obj)

復(fù)制代碼 代碼如下:
String i=”abc”;
object obj=(object)i;

裝箱時(shí)到底發(fā)生的事情:

1)、在托管堆中分配內(nèi)存。分配的內(nèi)存量是值類型各字段所需的內(nèi)存量,還要加上托管堆所有對(duì)象都有的兩個(gè)額外成員(類型對(duì)象指針和同步塊索引)所需的內(nèi)存量

2)、值類型的字段復(fù)制到新分配的堆內(nèi)存

3)、返回對(duì)象地址,現(xiàn)在該地址是對(duì)象引用;值類型成了引用類型

2、拆箱:就是從引用數(shù)據(jù)中提取值類型(比如將object對(duì)象obj的值賦給string類型的變量i)

復(fù)制代碼 代碼如下:
object obj=”abc”;
string i=(string)obj;

拆箱不是裝箱過(guò)程倒過(guò)來(lái),拆箱的代價(jià)愛(ài)比裝箱低的多,拆箱是獲取指針的過(guò)程,該指針指向包含在一個(gè)對(duì)象中的原始值類型。

拆箱后將堆中的字段包含的值復(fù)制棧的值類型實(shí)例中。

3、值類型變?yōu)橐妙愋筒灰欢ㄒb箱,例如:

復(fù)制代碼 代碼如下:
string str = "joye.net" + 26; //需要將26裝箱為string類型
string str1 = "joye.net" + 26.ToString(); //tostring后不需要裝箱

感興趣的可以用IL看一下。

上一篇:C#遞歸算法之快速排序

欄    目:C#教程

下一篇:C#遞歸算法之分而治之策略

本文標(biāo)題:淺談C#中的值類型和引用類型

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6426.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有