当前位置:编程学习 > C#/ASP.NET >>

C#中结构体实现接口后是值类型还是引用类型

[csharp]   

 [csharp]
namespace _3._12强制类型转换 

    /// <summary>  
    /// 将派生类的实例强制转化为基类类型总是安全的。甚至也可以将派生类实例转化为抽象基类类型。强制转化为基类型以后,基引用就是派生类对象的基本部分的别名。  
    /// 将一个值类型强制转化为一个基本接口具有不同的语义。将一个值类型强制转化为一个接口类型时,创建一个不同的实体。接口是引用类型。无论何时将一个值类型  
    /// 强制转化为引用类型,包括一个值类型转化为一个接口,都会发生装箱操纵。装箱操作分配内存,并将该值类型复制到托管堆上。原始值和副本没有关系,任何一个  
    /// 发生改变都不会影响另一个。  
    /// </summary>  
    public inte易做图ce 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 inte易做图ce 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)是接口类型时,对象是引用类型,对象在堆中创建

 

 

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,