[原创]慢话interface是值类型还是引用类型
2012-09-07 15:55
295 查看
OK!首先不得不说,笔者最开始认为interface是引用类型,为什么呢,那是因为经常看见IList list=...、ICollection list=...这一类的可以拿去指向实现的类的对象或者对象集合,前一段时间看过一篇也是关于讨论interface时值类型还是引用类型的,结果好像说是引用类型,但是看着挺有道理的,最近有空自己试验的一把,得出的结果让我迷惑了,不知道是我错了还是。。。
再来说说,接口不仅可以被值类型的如struct继承,而且可以被class继承,这儿就感觉看到interface不太像是引用类型了,再次就是它是不是值类型的呢,直接代码演示
结果就是:
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代码就知道了
写了这么多就是想弄明白一点为什么struct可以继承interface并实现它的方法,而struct是值类型。。。
再来说说,接口不仅可以被值类型的如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是值类型。。。
相关文章推荐
- C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊
- Javascript小知识点(七):数据类型赋值,浅拷贝,深拷贝(数组值传递还是引用传递)
- java_父类和接口的引用类型的代码及其详解_原创
- 【Vegas原创】未能找到引用的组件"***.dll",未能加载类型库。library not registered解决方案~
- 关于string是值类型还是引用类型
- C#中的DateTime是值类型还是引用类型
- 面试之路(18)-java的函数参数传递类型之值传递还是引用传递
- Java中的对象类型像引用还是指针,谁是谁非?
- String是原始数据类型还是引用数据类型
- string 是值类型,还是引用类型(.net)
- myeclipse常用快捷键_最常用的还是ctrl+c、v啊。。。类型写的是原创,其实大多数还是你懂的
- 参数自动选择引用类型还是值类型
- 面试之路(18)-java的函数参数传递类型之值传递还是引用传递
- List<int>是值类型还是引用类型
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术07--引用类型和值类型
- C#Lab(一):结构体包含引用、结构体实现接口后是引用类型还是值类型
- [自学问题总结]net中String是引用类型还是值类型
- net中String是引用类型还是值类型
- 面试之路(18)-java的函数参数传递类型之值传递还是引用传递
- 【原创】理解C#的引用类型的值传递