• [原创]慢话interface是值类型还是引用类型


         OK!首先不得不说,笔者最开始认为interface是引用类型,为什么呢,那是因为经常看见IList list=...、ICollection list=...这一类的可以拿去指向实现的类的对象或者对象集合,前一段时间看过一篇也是关于讨论interface时值类型还是引用类型的,结果好像说是引用类型,但是看着挺有道理的,最近有空自己试验的一把,得出的结果让我迷惑了,不知道是我错了还是。。。

        再来说说,接口不仅可以被值类型的如struct继承,而且可以被class继承,这儿就感觉看到interface不太像是引用类型了,再次就是它是不是值类型的呢,直接代码演示

    public interface IPlay
        {
            void PlayMessage();
        }
        public struct ValueStudent : IPlay
        {
    
            #region IPlay 成員
    
            public void PlayMessage()
            {
                Console.WriteLine("Hello,我是值類型!");
            }
    
            #endregion
        }
        public class RefStudent : IPlay
        {
    
            #region IPlay 成員
    
            public void PlayMessage()
            {
                Console.WriteLine("Hello,我是引用類型!");
            }
    
            #endregion
        }
        
    
        class Program
        {
            static void Main(string[] args)
            {
                IPlay valuePlay = new ValueStudent();
                valuePlay.PlayMessage();
    
                Console.WriteLine("------------------------");
    
                IPlay refStudent = new RefStudent();
                refStudent.PlayMessage();
    
                Console.ReadLine();
            }
        }

      结果就是:

          Hello,我是值類型!

          ------------------------

          Hello,我是引用類型!

        再回到代码,你看看 

            IPlay valuePlay = new ValueStudent();

            IPlay refStudent = new RefStudent();

      这两句是重点啊,IPlay 他既可以指向值类型的也可以指向引用类型的,那它还是值类型的么?明显它不是值类型了,那它到底是什么类型呢?今天突然想到3.5的.NET framework里面的var关键字,我勒个去啊var不就是既可以当爹又可以当妈的高富帅么,自此我的结论就是interface就和var一样既可以指向值类型也可以指向引用类型,反正C#有个推断类型的功能。

      另外:VS2005不知道是哪个版本的.NET framework里面interface你爱怎么用就怎么用,但是没有var关键字,我猜想后来的var是不是就复用interface的一些实现的功能。。。

      欢迎各种表达。

    好吧,我承认上面都是忽悠人的,其实我知道interface是引用类型,为什么,看IL代码就知道了

    .method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // 程式碼大小       54 (0x36)
      .maxstack  1
      .locals init ([0] class ModelApp.IPlay valuePlay,
               [1] class ModelApp.IPlay refStudent,
               [2] valuetype ModelApp.ValueStudent CS$0$0000)
      IL_0000:  nop
      IL_0001:  ldloca.s   CS$0$0000
      IL_0003:  initobj    ModelApp.ValueStudent//初始化ValueStudent
      IL_0009:  ldloc.2
      IL_000a:  box        ModelApp.ValueStudent//valuePlay引用  装箱ValueStudent实例
      IL_000f:  stloc.0
      IL_0010:  ldloc.0
      IL_0011:  callvirt   instance void ModelApp.IPlay::PlayMessage()
      IL_0016:  nop
      IL_0017:  ldstr      "------------------------"
      IL_001c:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0021:  nop
      IL_0022:  newobj     instance void ModelApp.RefStudent::.ctor()
      IL_0027:  stloc.1
      IL_0028:  ldloc.1
      IL_0029:  callvirt   instance void ModelApp.IPlay::PlayMessage()
      IL_002e:  nop
      IL_002f:  call       string [mscorlib]System.Console::ReadLine()
      IL_0034:  pop
      IL_0035:  ret
    } // end of method Program::Main

    写了这么多就是想弄明白一点为什么struct可以继承interface并实现它的方法,而struct是值类型。。。

    ※如果你觉得这篇文章不错,请点击推荐。如果你觉得我写的对你有用请关注我。
    作者:Max蚊子
    网站:feiger.cn         飞鸽博客,关注互联网、站长圈的程序员博客!
                 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    (三)xpath爬取4K高清美女壁纸
    聚焦爬虫:数据解析
    (二)requests-爬取国家药监局生产许可证数据
    (一)requests-实战小练习
    requests模块
    spring+apache dbcp +oracle 连接池配置以及优化
    IntelliJ IDEA 注释模版 输入/**后 不显示配置好的模板
    oracle 隔离级别、事务怎么开始的以及如何查看数据库采用字符集
    java 日期处理相关
    Oracle 插入数据时获取系统时间
  • 原文地址:https://www.cnblogs.com/kim01/p/2675189.html
Copyright © 2020-2023  润新知