首页 > 技术文章 > C#中接口是值类型还是引用类型?

fastcam 2021-07-08 18:01 原文

 //测试代码
     internal interface ITest1
    {
        void Test1();
    }
    class A:ITest1
    {
        public void Test1(){}
    }
    struct B:ITest1
    {
        public void Test1(){}
    }
    static class  App
    {
        public static int Main()
        {
            ITest1 a, b;
            A class_a = new A();
            B struct_b = new B();
            Console.WriteLine(struct_b);
            Console.WriteLine(class_a);
            a = class_a;
            b = struct_b;
            Console.WriteLine(b);
            Console.WriteLine(a);
            return 0;
        }
    }

  

IL代码,可以很明确的看出接口是引用类型

.method public hidebysig static 
		int32 Main () cil managed 
	{
		// 方法起始 RVA 地址 0x2060
		// 方法起始地址(相对于文件绝对值:0x0260)
		// 代码长度 65 (0x41)
		.maxstack 1
		.entrypoint
		.locals init (
			[0] class CSharp1.ITest1,、、、、
			[1] class CSharp1.ITest1,、
			[2] class CSharp1.A,
			[3] valuetype CSharp1.B,K
			[4] int32
		)

		// 0x026C: 00
		IL_0000: nop
		// 0x026D: 73 03 00 00 06
		IL_0001: newobj instance void CSharp1.A::.ctor()
		// 0x0272: 0C
		IL_0006: stloc.2
		// 0x0273: 12 03
		IL_0007: ldloca.s 3
		// 0x0275: FE 15 04 00 00 02
		IL_0009: initobj CSharp1.B
		// 0x027B: 09
		IL_000f: ldloc.3
		// 0x027C: 8C 04 00 00 02
		IL_0010: box CSharp1.B//装箱操作
		// 0x0281: 28 06 00 00 0A
		IL_0015: call void [mscorlib]System.Console::WriteLine(object)
		// 0x0286: 00
		IL_001a: nop
		// 0x0287: 08
		IL_001b: ldloc.2
		// 0x0288: 28 06 00 00 0A
		IL_001c: call void [mscorlib]System.Console::WriteLine(object)
		// 0x028D: 00
		IL_0021: nop
		// 0x028E: 08
		IL_0022: ldloc.2
		// 0x028F: 0A
		IL_0023: stloc.0
		// 0x0290: 09
		IL_0024: ldloc.3
		// 0x0291: 8C 04 00 00 02
		IL_0025: box CSharp1.B
		// 0x0296: 0B
		IL_002a: stloc.1
		// 0x0297: 07
		IL_002b: ldloc.1
		// 0x0298: 28 06 00 00 0A
		IL_002c: call void [mscorlib]System.Console::WriteLine(object)
		// 0x029D: 00
		IL_0031: nop
		// 0x029E: 06
		IL_0032: ldloc.0
		// 0x029F: 28 06 00 00 0A
		IL_0033: call void [mscorlib]System.Console::WriteLine(object)
		// 0x02A4: 00
		IL_0038: nop
		// 0x02A5: 16
		IL_0039: ldc.i4.0
		// 0x02A6: 13 04
		IL_003a: stloc.s 4
		// 0x02A8: 2B 00
		IL_003c: br.s IL_003e

		// 0x02AA: 11 04
		IL_003e: ldloc.s 4
		// 0x02AC: 2A
		IL_0040: ret
	} // 方法 App::Main 结束DS

  

推荐阅读