最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、基本概念

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

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

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

以下是值類型和引用類型對照表

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

二、代碼展示

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

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

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

修改代碼如下:

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

由上圖可以知:

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

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

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

using System;

namespace ConsoleApplication2
{
  //引用類型(因為‘class')
  public class SomeRef
  {
    public int x { get; set; }
  }
  //值類型(因為‘struct')
  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都會修改
      v1.x = 8;    //v1.x會更改,v2.x不會

      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ù)打包到引用類型的實例中(比如將string類型的值abc賦給object對象obj)

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

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

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

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

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

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

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

拆箱不是裝箱過程倒過來,拆箱的代價愛比裝箱低的多,拆箱是獲取指針的過程,該指針指向包含在一個對象中的原始值類型。

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

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

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

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

相關(guān)文章

  • 深入多線程之:雙向信號與競賽的用法分析

    深入多線程之:雙向信號與競賽的用法分析

    本篇文章是對雙向信號與競賽的用法進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • C#之WinForm WebBrowser實用技巧匯總

    C#之WinForm WebBrowser實用技巧匯總

    這篇文章主要介紹了C#之WinForm WebBrowser實用技巧匯總,包括常見的各種設(shè)置及信息獲取等,需要的朋友可以參考下
    2014-08-08
  • c# 文件操作(移動,復(fù)制,重命名)

    c# 文件操作(移動,復(fù)制,重命名)

    這篇文章主要介紹了c# 如何對文件操作(移動,復(fù)制,重命名),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • UnityShader實現(xiàn)百葉窗效果

    UnityShader實現(xiàn)百葉窗效果

    這篇文章主要為大家詳細介紹了UnityShader實現(xiàn)百葉窗效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 如何在C# 中使用 FFmpeg.NET

    如何在C# 中使用 FFmpeg.NET

    這篇文章主要介紹了如何在C# 中使用 FFmpeg.NET,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#開發(fā)Windows窗體應(yīng)用程序的簡單操作步驟

    C#開發(fā)Windows窗體應(yīng)用程序的簡單操作步驟

    這篇文章主要介紹了C#開發(fā)Windows窗體應(yīng)用程序的簡單操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C# 操作符之三元操作符淺析

    C# 操作符之三元操作符淺析

    C# 操作符之三元操作符“?:”是如何使用的呢?C# 操作符之三元操作符“?:”需要注意的是什么呢?那么本文就向你簡單介紹C# 操作符之三元操作符“?:”的基本情況。
    2011-02-02
  • C#生成XML的三種途徑小結(jié)

    C#生成XML的三種途徑小結(jié)

    為了全面,這里都將XML保存到文件中,有三種生成XML的方式,需要的朋友可以參考下
    2013-05-05
  • 淺析C#的復(fù)制和克隆

    淺析C#的復(fù)制和克隆

    這篇文章主要介紹了淺析C#的復(fù)制和克隆,需要的朋友可以參考下
    2014-07-07
  • C#靜態(tài)方法的使用

    C#靜態(tài)方法的使用

    這篇文章介紹了C#靜態(tài)方法的使用,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04

最新評論

江安县| 卢湾区| 鹤峰县| 石景山区| 安龙县| 五峰| 赤城县| 阿尔山市| 商丘市| 乐清市| 安仁县| 惠水县| 遵义县| 饶平县| 开封市| 治县。| 太原市| 邳州市| 亳州市| 鄂托克旗| 齐齐哈尔市| 望江县| 广灵县| 赤城县| 海丰县| 汪清县| 镇安县| 保康县| 崇文区| 江津市| 措美县| 嫩江县| 察雅县| 光泽县| 柘城县| 西安市| 苍南县| 齐河县| 晋城| 河津市| 德钦县|