程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 之值類型和引用類型,

C# 之值類型和引用類型,

編輯:C#入門知識

C# 之值類型和引用類型,


本文意在鞏固基礎知識,並不是對其進行深入剖析,還望理解。
本文是對此項知識的整理文,有些內容來源於網絡,其他為博主原創,所以難免會有一些小得瑕疵,敬請諒解。
所有示例均是博主測試過的,如有轉載請標明出處,謝謝。

值類型與引用類型是很基礎的知識,也有很多對此的介紹,如果想深入了解,張老師的博客講解的很好,鏈接如下:
http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html
我在這裡只是淺淺的介紹一下下:
從概念上看,值類型直接存儲其值,而引用類型存儲對其值的引用。值類型就是現金,要用直接用;引用類型是存折,要用還得先去銀行取現。

我們知道,C#中的每一種類型要麼是值類型,要麼是引用類型。所以每個對象要麼是值類型的實例,要麼是引用類型的實例。
值類型和引用類型的基類
引用類型和值類型都繼承自System.Object類。不同的是,幾乎所有的引用類型都直接從System.Object繼承,而值類型則繼承其子類,即直接繼承System.ValueType。
作為所有類型的基類,System.Object提供了一組方法,這些方法在所有類型中都能找到,其中包含toString方法及clone等方法。
System.ValueType直接繼承System.Object,即System.ValueType本身是一個類類型,而不是值類型;System.ValueType沒有添加任何成員,但覆蓋了所繼承的一些方法,使其更適合於值類型。例如,ValueType重寫了Equals()方法,從而對值類型按照實例的值來比較,而不是引用地址來比較。

struct Program
    {
        static void Main(string[] args)
        {
            Program testType = new Program();

            if (testType.GetType().IsValueType)
            {
                Console.WriteLine("{0} is value type.", testType.ToString());
            }
            Console.ReadLine();
        }
    }

值類型
值類型的特性:
1.C#的所有值類型均隱式派生自System.ValueType。
各個值類型及其基類:
結構體:struct(直接派生於System.ValueType);
數值類型:
整型:
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);
用於財務計算的高精度decimal型:decimal(System.Decimal)。
bool:bool(System.Boolean的別名);
枚舉:enum(派生於System.Enum);
可空類型(派生於System.Nullable泛型結構體,語法 T? 是 System.Nullable<T> 的簡寫,此處的 T 為值類型。)
2.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
例如:
int i = new int();
等價於:
Int32 i = new Int32();
等價於:
int i = 0;
等價於:
Int32 i = 0;
使用new運算符時,將調用特定類型的默認構造函數並對變量賦以默認值。在上例中,默認構造函數將值0賦給了i。
3.所有的值類型都是密封(seal)的,所以無法派生出新的值類型。
4.
值類型的實例通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中。
引用類型
引用類型的特性:
1.
C#的所有引用類型均隱式派生自System.object。
各個引用類型及其基類:
數組:(派生於System.Array)數組的元素,不管是引用類型還是值類型,都存儲在托管堆上;
類:class(派生於System.Object);
接口:interface(接口不是一個“東西”,所以不存在派生於何處的問題。);
委托:delegate(派生於System.Delegate);
object(System.Object的別名);
字符串:string(System.String的別名)。
2.引用類型可以派生出新的類型。
3.引用類型可以包含null值。
4.
引用類型變量的賦值只復制對對象的引用,而不復制對象本身。
5.引用類型的對象總是在進程堆中分配(動態分配)。

值類型和引用類型的區別
所有繼承System.Value的類型都是值類型,其他類型都是引用類型。
引用類型可以派生出新的類型,而值類型不能;
引用類型存儲在堆中,而值類型既可以存儲在堆中也可以存儲在棧中。
引用類型可以包含null值,值類型不能(可空類型功能允許將 null 賦給值類型);
引用類型變量的賦值只復制對對象的引用,而不復制對象本身。而將一個值類型變量賦給另一個值類型變量時,將復制包含的值。
當比較兩個值類型時,進行的是內容比較;而比較兩個引用類型時,進行的是引用比較。
值類型在內存管理方面具有更好的效率,並且不支持多態,適合用作存儲數據的載體;引用類型支持多態,適合用於定義應用程序的行為。
Int[]是引用類型還是值類型
數組類型是引用類型,它們都繼承System.Array,而System.Array繼承自System.Object。所以所有的數組類型都是引用類型

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved