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

C#中結構體實現接口後是值類型還是引用類型

編輯:C#入門知識

[csharp]   

 [csharp]
namespace _3._12強制類型轉換 

    /// <summary>  
    /// 將派生類的實例強制轉化為基類類型總是安全的。甚至也可以將派生類實例轉化為抽象基類類型。強制轉化為基類型以後,基引用就是派生類對象的基本部分的別名。  
    /// 將一個值類型強制轉化為一個基本接口具有不同的語義。將一個值類型強制轉化為一個接口類型時,創建一個不同的實體。接口是引用類型。無論何時將一個值類型  
    /// 強制轉化為引用類型,包括一個值類型轉化為一個接口,都會發生裝箱操縱。裝箱操作分配內存,並將該值類型復制到托管堆上。原始值和副本沒有關系,任何一個  
    /// 發生改變都不會影響另一個。  
    /// </summary>  
    public interface IAdd { 
        void Increment(); 
        int Count 
        { 
            get; 
        } 
    } 
    public struct XStruct : IAdd { 
        private int propCount; 
        public void Increment() { 
            propCount++; 
        } 
        public int Count { 
            get { 
                return propCount; 
            } 
        } 
    } 
    public class Starter { 
        static void Main() { 
            XStruct xstruct = new XStruct(); 
            xstruct.Increment(); 
            IAdd obj = xstruct; 
            xstruct.Increment(); 
            Console.WriteLine(xstruct.Count);//2  
            Console.WriteLine(obj.Count);//1  
            //說明obj和xstruct指向不同的實體obj=xstruct創建了一個副本。  
            //這是類類型很顯著的標志  
            IAdd boj2 = obj; 
            Console.WriteLine(obj.Count);//1  
            //說明obi和obj2指向同一個實體對象,obj=obj2是給obj賦值  
            //這是引用類型的和能顯著的標志  
            Console.ReadKey(); 
        } 
    } 

namespace _3._12強制類型轉換
{
    /// <summary>
    /// 將派生類的實例強制轉化為基類類型總是安全的。甚至也可以將派生類實例轉化為抽象基類類型。強制轉化為基類型以後,基引用就是派生類對象的基本部分的別名。
    /// 將一個值類型強制轉化為一個基本接口具有不同的語義。將一個值類型強制轉化為一個接口類型時,創建一個不同的實體。接口是引用類型。無論何時將一個值類型
    /// 強制轉化為引用類型,包括一個值類型轉化為一個接口,都會發生裝箱操縱。裝箱操作分配內存,並將該值類型復制到托管堆上。原始值和副本沒有關系,任何一個
    /// 發生改變都不會影響另一個。
    /// </summary>
    public interface IAdd {
        void Increment();
        int Count
        {
            get;
        }
    }
    public struct XStruct : IAdd {
        private int propCount;
        public void Increment() {
            propCount++;
        }
        public int Count {
            get {
                return propCount;
            }
        }
    }
    public class Starter {
        static void Main() {
            XStruct xstruct = new XStruct();
            xstruct.Increment();
            IAdd obj = xstruct;
            xstruct.Increment();
            Console.WriteLine(xstruct.Count);//2
            Console.WriteLine(obj.Count);//1
            //說明obj和xstruct指向不同的實體obj=xstruct創建了一個副本。
            //這是類類型很顯著的標志
            IAdd boj2 = obj;
            Console.WriteLine(obj.Count);//1
            //說明obi和obj2指向同一個實體對象,obj=obj2是給obj賦值
            //這是引用類型的和能顯著的標志
            Console.ReadKey();
        }
    }
}
在C#中數據類型分為值類型和引用類型
值類型:結構體、枚舉
引用類型:類、接口、數組、委托


 

 

最後得出結論:
當我們聲明對象(s1、s2)是結構體類型時,對象是值類型,對象在棧中創建
當我們聲明對象(ic1、ic2)是接口類型時,對象是引用類型,對象在堆中創建

 

 

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