您的位置:首页 > 其它

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

2012-09-07 15:55 295 查看
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是值类型。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: