.NET引用类型与值类型
值類型和引用類型的基類
引用類型和值類型都繼承自System.Object類。不同的是,幾乎所有的引用類型都直接從System.Object繼承,而值類型則繼承其子類,即直接繼承System.ValueType。
作為所有類型的基類,System.Object提供了一組方法,這些方法在所有類型中都能找到,其中包含toString方法及clone等方法。
System.ValueType直接繼承System.Object,即System.ValueType本身是一個類類型,而不是值類型;System.ValueType沒有添加任何成員,但覆蓋了所繼承的一些方法,使其更適合于值類型。例如,ValueType重寫了Equals()方法,從而對值類型按照實例的值來比較,而不是引用地址來比較。
值類型
值類型的特性:
1.C#的所有值類型均隱式派生自System.ValueType。
各個值類型及其基類:
結(jié)構(gòu)體:struct(直接派生于System.ValueType);
數(shù)值類型:
整型:
short(System.Int16),ushort(System.UInt16),int(System.Int32),uint(System.UInt32),
long(System.Int64),ulong(System.UInt64),
sbyte(System.SByte的別名),byte(System.Byte),
字符型:char(System.Char);
浮點型:float(System.Single),double(System.Double);
用于財務(wù)計算的高精度decimal型:decimal(System.Decimal)。
bool型:bool(System.Boolean的別名);
枚舉:enum(派生于System.Enum);
可空類型(派生于System.Nullable泛型結(jié)構(gòu)體,語法 T? 是 System.Nullable<T> 的簡寫,此處的 T 為值類型。)
2.每種值類型均有一個隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值。
例如:
int i = new int();
等價于:
Int32 i = new Int32();
等價于:
int i = 0;
等價于:
Int32 i = 0;
使用new運算符時,將調(diào)用特定類型的默認(rèn)構(gòu)造函數(shù)并對變量賦以默認(rèn)值。在上例中,默認(rèn)構(gòu)造函數(shù)將值0賦給了i。
3.所有的值類型都是密封(seal)的,所以無法派生出新的值類型。
4.值類型的實例通常是在線程棧上分配的(靜態(tài)分配),但是在某些情形下可以存儲在堆中。
引用類型
引用類型的特性:
1.C#的所有引用類型均隱式派生自System.object。
各個引用類型及其基類:
數(shù)組:(派生于System.Array)數(shù)組的元素,不管是引用類型還是值類型,都存儲在托管堆上;
類:class(派生于System.Object);
接口:interface(接口不是一個“東西”,所以不存在派生于何處的問題。);
委托:delegate(派生于System.Delegate);
object:(System.Object的別名);
字符串:string(System.String的別名)。
2.引用類型可以派生出新的類型。
3.引用類型可以包含null值。
4.引用類型變量的賦值只復(fù)制對對象的引用,而不復(fù)制對象本身。
5.引用類型的對象總是在進(jìn)程堆中分配(動態(tài)分配)。
值類型和引用類型的區(qū)別
所有繼承System.Value的類型都是值類型,其他類型都是引用類型。
引用類型可以派生出新的類型,而值類型不能;
引用類型存儲在堆中,而值類型既可以存儲在堆中也可以存儲在棧中。
引用類型可以包含null值,值類型不能(可空類型功能允許將 null 賦給值類型);
引用類型變量的賦值只復(fù)制對對象的引用,而不復(fù)制對象本身。而將一個值類型變量賦給另一個值類型變量時,將復(fù)制包含的值。
當(dāng)比較兩個值類型時,進(jìn)行的是內(nèi)容比較;而比較兩個引用類型時,進(jìn)行的是引用比較。
值類型在內(nèi)存管理方面具有更好的效率,并且不支持多態(tài),適合用作存儲數(shù)據(jù)的載體;引用類型支持多態(tài),適合用于定義應(yīng)用程序的行為。
Int[]是引用類型還是值類型
數(shù)組類型是一族類型,它們都繼承System.Array,而System.Array繼承自System.Object。所以所有的數(shù)組類型都是引用類型
以上收集自博客園:佳園,在此感謝!
下面補(bǔ)充一個實例
static void Main(string[] args)
??????? {
??????????? //C# intern pool 拘留池
??????????? string a = "abc";
??????????? string b = a;
??????????? string c = a;
??????????? int d = 10;
??????????? int e = d;
??????????? int f = e;
??????????? unsafe
??????????? {
??????????????? Console.WriteLine(getMemory(a));
??????????????? Console.WriteLine(getMemory(b));
??????????????? Console.WriteLine(getMemory(c));
??????????????? c = "abc";
??????????????? Console.WriteLine(getMemory(c));
??????????????? c = "abcd";//拘留池內(nèi)加入新的對象
??????????????? Console.WriteLine(getMemory(c));
??????????????? Console.WriteLine("-----------------------");
??????????????? Console.WriteLine(getMemory(d));
??????????????? Console.WriteLine(getMemory(e));
??????????????? Console.WriteLine(getMemory(f));
??????????????? f = 20;
??????????????? Console.WriteLine(getMemory(f));
??????????????? Console.WriteLine("-----------------------");
??????????????? int* g = &d;
??????????????? Console.WriteLine(getMemory(d));
??????????????? Console.WriteLine(getMemory(e));
??????????????? Console.WriteLine(getMemory(*g));
??????????????? Console.WriteLine(getMemory(10));//輸出地址都不同
??????????????? Console.ReadLine();
??????????? }
??????? }
??????? public static string getMemory(object o) // 獲取引用類型的內(nèi)存地址方法
??{
???GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
???IntPtr addr = h.AddrOfPinnedObject();
???return "0x" + addr.ToString("X");
??}
轉(zhuǎn)載于:https://blog.51cto.com/5460095/1812197
總結(jié)
以上是生活随笔為你收集整理的.NET引用类型与值类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用VIM打造C语言编写器
- 下一篇: 前端框架Bootstrap 教程