亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談C#中的值類(lèi)型和引用類(lèi)型

 更新時(shí)間:2016年06月17日 08:54:23   作者:Joye.Net  
在C#中值類(lèi)型的變量直接存儲(chǔ)數(shù)據(jù),而引用類(lèi)型的變量持有的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中。下面我們來(lái)簡(jiǎn)單談?wù)凜#中的值類(lèi)型和引用類(lèi)型

一、基本概念

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

值類(lèi)型在線(xiàn)程棧分配空間,引用類(lèi)型在托管堆分配空間

值類(lèi)型轉(zhuǎn)為引用類(lèi)型稱(chēng)成為裝箱,引用類(lèi)型轉(zhuǎn)為值類(lèi)型稱(chēng)為拆箱

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

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

二、代碼展示

定義一個(gè)類(lèi)和結(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;

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

using System;

namespace ConsoleApplication2
{
  //引用類(lèi)型(因?yàn)椤甤lass')
  public class SomeRef
  {
    public int x { get; set; }
  }
  //值類(lèi)型(因?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();
    }
  }
}

三、值類(lèi)型裝箱、拆箱

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

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

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

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

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

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

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

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

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

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

3、值類(lèi)型變?yōu)橐妙?lèi)型不一定要裝箱,例如:

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

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

相關(guān)文章

  • c# 編寫(xiě)的簡(jiǎn)單飛行棋游戲

    c# 編寫(xiě)的簡(jiǎn)單飛行棋游戲

    這個(gè)簡(jiǎn)單的飛行棋游戲主要是講的方法怎么應(yīng)用,充分的去理解方法和方法的調(diào)用。整體收獲還是很大的。感興趣的朋友可以參考下
    2021-06-06
  • WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(三)之時(shí)間線(xiàn)(TimeLine)

    WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(三)之時(shí)間線(xiàn)(TimeLine)

    這篇文章介紹了WPF實(shí)現(xiàn)動(dòng)畫(huà)效果之時(shí)間線(xiàn)(TimeLine),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法

    C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法

    這篇文章介紹了C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#自定義HttpFilter模塊完善實(shí)例

    C#自定義HttpFilter模塊完善實(shí)例

    這篇文章主要介紹了C#自定義HttpFilter模塊完善的方法,以實(shí)例的形式具體講述了C#自定義HttpFilter模塊的原理與完善的方法,非常實(shí)用,需要的朋友可以參考下
    2014-10-10
  • C#簡(jiǎn)單實(shí)現(xiàn)SNMP的方法

    C#簡(jiǎn)單實(shí)現(xiàn)SNMP的方法

    這篇文章主要介紹了C#簡(jiǎn)單實(shí)現(xiàn)SNMP的方法,通過(guò)一個(gè)簡(jiǎn)單的自定義類(lèi)分析了C#實(shí)現(xiàn)SNMP的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#設(shè)計(jì)模式之裝飾器模式實(shí)例詳解

    C#設(shè)計(jì)模式之裝飾器模式實(shí)例詳解

    本文詳細(xì)講解了C#設(shè)計(jì)模式之裝飾器模式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • C# WinForm實(shí)現(xiàn)鼠標(biāo)穿透功能

    C# WinForm實(shí)現(xiàn)鼠標(biāo)穿透功能

    在WinForm開(kāi)發(fā)時(shí),會(huì)用到這樣一個(gè)場(chǎng)景,給屏幕增加水印Logo,但不影響畫(huà)面的操作,這里就會(huì)用到鼠標(biāo)穿透功能,下面我們就來(lái)學(xué)習(xí)一下鼠標(biāo)穿透功能的具體實(shí)現(xiàn)吧
    2023-11-11
  • C#單線(xiàn)程和多線(xiàn)程端口掃描器詳解

    C#單線(xiàn)程和多線(xiàn)程端口掃描器詳解

    這篇文章主要為大家詳細(xì)介紹了C#單線(xiàn)程和多線(xiàn)程端口掃描器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C#簡(jiǎn)單連接sql數(shù)據(jù)庫(kù)的方法

    C#簡(jiǎn)單連接sql數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了C#簡(jiǎn)單連接sql數(shù)據(jù)庫(kù)的方法,涉及C#基于控制臺(tái)的數(shù)據(jù)庫(kù)連接創(chuàng)建于命令執(zhí)行相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • Unity3D移動(dòng)端實(shí)現(xiàn)搖一搖功能

    Unity3D移動(dòng)端實(shí)現(xiàn)搖一搖功能

    這篇文章主要為大家詳細(xì)介紹了基于Unity3D移動(dòng)端實(shí)現(xiàn)搖一搖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論