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

 
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)是接口类型时,对象是引用类型,对象在
堆中创建

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值