关于接口是值类型还是引用类型的猜测

虽然工作也有几年时间了,但时常能暴露出基础知识薄弱的问题,因此,有空闲时间时总喜欢把缺下的功课补齐。

今天想讨论的是,接口到底是引用类型还是值类型。

要想说清楚接口到底是引用类型还是值类型,就需要先解释一下值类型跟引用类型。

值类型,简单理解就是继承自ValueType的类型,除过可空类型(如int?,bool?)外,值不能为null,通常情况下存储在栈中。而引用类型不从ValueType继承,其值可以为null,存储在托管堆中,由GC负责清理。

既然大致了解了什么是值类型和引用类型,或者说,值类型和引用类型的区别,那么有一个简单粗暴的办法判定接口类型问题----可以调用Object的实例方法GetType(),得到Type实例。通过Type的实例属性BaseType,直接判断接口的基类型。只是,接口可以理解成一种抽象类型,抽象类型是不允许实例化的,只能由实现类实例化。值类型以及引用类型都可以实现接口,所以通过基类型的方法并非个好方法。

偶然间发现一段代码:

  const int i = 5;

  IFormattable ftt = i;

  这里不得不提到另一对概念,装箱和拆箱。装箱会将值类型经过一系列包装放到一个箱子,转换为引用类型,然后存放到托管堆上面。拆箱和这个过程相反,从托管堆上面拿到这个箱子,经过一些列的拆分操作,从引用类型转换成值类型。当然,拆箱过程涉及类型检查,这里不细说。总之,装箱可以简单理解为值类型-->引用类型,拆箱可以简单理解为引用类型-->值类型。有了这些理解就够了。

  再来观察上面的代码段,i 为int类型,int类型是系统自定义的值类型。IFormattable是接口类型,如果接口类型是值类型,那么IFormattable ftt = i 是值类型到值类型的转换,将不存在装箱操作。如果接口类型是引用类型,那么IFormattable ftt = i 必然存在从值类型到引用类型的转换,即装箱操作。那就不多说了,采用IL查看工具看下源码就明白了!

  

using System;

namespace Interview
{
    class TestInterfaceType
    {
        public void Test()
        {
            const int i = 5;
            IFormattable ftt = i;
        }
    }
}

Source Code

  上面是源码,下面是IL源码(可以通过ILSpy、Reflactor或者VS 自带的ILDasm工具查看IL代码):

.method public hidebysig
    instance void Test () cil managed
{
    // Method begins at RVA 0x2330
    // Code size 9 (0x9)
    .maxstack 1
    .locals init (
        [0] class [mscorlib]System.IFormattable ftt
    )

    IL_0000: nop
    IL_0001: ldc.i4.5
    IL_0002: box [mscorlib]System.Int32
    IL_0007: stloc.0
    IL_0008: ret
} // end of method TestInterfaceType::Test

IL Code

  亮点在于 IL_0002: box [mscorlib]System.Int32 这一行,其中 box 就代表装箱指令。基本就可以断定,接口属于引用类型了。

  当然,这些只是个人的一些理解,如果有不妥的地方,欢迎各位指正。

时间: 2024-10-18 04:32:40

关于接口是值类型还是引用类型的猜测的相关文章

数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>

C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override重写 无论什么情况,都是执行新的方法(成员) 继承是实现多态的一个前提,没有继承多态是不能实现的 父类与子类实现多态 抽象类与子类实现 抽象类不能实例化 抽象类中的抽象方法没有方法体 抽象类的成员有哪些   ->包含非抽象成员   ->不能实例化   ->子类必须实现父类的 抽象方法,除非子

Java值类型和引用类型

[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字符型4,逻辑型 八种: 1,整型3种 by

java 值类型和引用类型的区别

1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字

c# 值类型与引用类型 值传递与引用传递

值类型与引用类型: 值类型 :1.值类型大小固定.存储在栈上.  2.不能继承,只能实现接口 3.派生自valuetype int double char float byte bool enum struct decimal 引用类型:1.在栈上存储了一个地址实际存储在堆中,大小不固定. 2.数组.类.接口.委托 string 数组 类 接口 委托 值传递与引用传递: 值类型按值传递.值类型按引用传递.引用类型按值传递.引用类型按引用传递. 值传递:默认传递都是值传递 ,把栈中内容拷贝一份引用

04.C#类型系统、值类型和引用类型(二章2.2-2.3)

今天要写的东西都是书中一些概念性的东西,就当抄笔记,以提问对话的方式将其写出来吧,说不定以后面试能有点谈资~~~ Q1.C#1系统类型包含哪三点特性? A1.C#1类型系统是静态的.显式的和安全的. Q2.为什么称为静态类型? A2.静态类型是用来描述表达式在编译时的类型,当声明一个类型的变量时,不能将变量指向其它类型的对象. Q3.显式类型和隐式类型的区别? A3.显式类型和隐式类型只有静态类型中的语言才有意义.显式类型需要显式声明一个变量的类型,而隐式类型则将类型的判断责任推给编译器,但是在

【转】C#详解值类型和引用类型区别

通用类型系统 值类型 引用类型 值类型和引用类型在内存中的部署 1 数组 2 类型嵌套 辨明值类型和引用类型的使用场合 5 值类型和引用类型的区别小结 首先,什么是值类型,什么是引用类型? 在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中. 值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型.值类型变量声明后,不管是否已经赋值,编译器为其分配内

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为

值类型和引用类型 区别

3.值类型和引用类型 区别: 存储位置:值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 传递方式:值类型传递实际值,引用类型传递是引用(地址). 值类型存取速度快,引用类型存取速度慢. 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用. 值类型继承自System.ValueType,引用类型继承自System.Object. 栈的内存分配是自动释放:而堆在.NET中会有GC来释放. C#中基本数据类型是值类型,结构体.枚举也是

Java中值类型和引用类型的区别

[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字符型4,逻辑型 八种: 1,整型3种 by