1. 程式人生 > 其它 >C#值型別和引用型別

C#值型別和引用型別

C#的型別一共分為兩類,一種是值型別(Value Type),一類是引用型別(Reference)。值型別的變數直接儲存資料,而引用型別的變數持有的是資料的引用,資料儲存在資料堆中。

值型別(value type)

byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為值型別。值型別變數聲明後,不管是否已經賦值,編譯器為其分配記憶體。

引用型別(reference type)

string 和 class統稱為引用型別。當宣告一個類時,只在棧中分配一小片記憶體用於容納一個地址,而此時並沒有為其分配堆上的記憶體空間。當使用 new 建立一個類的例項時,分配堆上的空間,並把堆上空間的地址儲存到棧上分配的小片空間中。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Parameters

{

    class Program

    {

        static void Main(string[] args)

        {

            Dowork();

        }

 

        static void Dowork()

        {

            int i = 0;  //
int 是值型別 Console.WriteLine(i); // i = 0 Pass.value(i); // 值型別使用的是 i 的副本,i不變 Console.WriteLine(i); // i = 0 WrappendInt wi = new WrappendInt(); // 建立類 WrappendInt 的另外一個例項 Console.WriteLine(wi.Number); // 0 // 被預設構造器初始化為 0 Pass.Reference(wi);
// 呼叫方法,wi 和 param 將引用同一個物件 Console.WriteLine(wi.Number); // 42 } } class Pass { public static void value(int param) { param = 42; // 賦值操作使用的是值型別引數的一個副本,原始引數不受影響 } public static void Reference(WrappendInt param) // 建立類 WrappendInt 的一個例項 { param.Number = 42; // 此引數是引用型別的引數 } } class WrappendInt // 類是引用型別 { public int Number; } }

總結

c#的值型別是為變數在棧上分配了一塊記憶體,用於儲存資料,而引用型別分為兩部分,宣告時只在棧上分配了一小部分記憶體,堆上沒分配,而new引用變數時,是在堆上分配了一塊記憶體,儲存的是棧上的記憶體地址,注意:struct是值型別,string和class是引用型別,string不需要new是因為想要語義化“字串”省略建立過程

文章轉載自:快速開發平臺
地址:https://www.hocode.com/