2010-10-29 53 views
2

将类转换为接口与将类转换为C#中的另一个类相同?在此过程中是否发生盒或拆箱?C#转换接口

interface Area 
{ 
    string TxtArea 
    { 
    get; 
    set; 
    } 
} 

转换为它的接口:

public void Test() 

    { 
     ExternArea extArea = new ExternArea(); 
     if(extArea is Area) 
     { 
     ((Area)extArea).TxtArea = "voila"; 
     } 
    } 
+0

用'I'开始接口名称是(恕我直言)很好的做法。 – nothrow 2010-10-29 13:02:58

回答

10

假设ExternArea是一类,而不是一个值类型(结构或枚举),没有涉及拳击。拳击曾经将值类型转换为引用类型实例。

注意,使用as通常虽然优选的:

Area area = extArea as Area; 
if (area != null) 
{ 
    area.TxtArea = "voila"; 
} 
+0

如果extArea继承Area接口,firts行会抛出异常吗? – ozsenegal 2010-10-29 12:55:14

+2

@user否,区域设置为空 – 2010-10-29 12:56:55

2

拳击只发生如果转换一个值类型(一个结构或一个数字)到引用类型object或接口通过实现所述struct

铸造引用类型(一类的一个实例),以不同的参考类型(基类或一个接口implemente d级)不涉及拳击。

即便如此,you should not cast unnecessarily;相反,使用as关键字,像这样:

Area area = extArea as Area; 
if (area != null) 
{ 
    area.TxtArea = "voila"; 
} 
+0

+1提供链接 – 2010-10-29 22:53:15

0

装箱和取消装箱具有封装对象内的值类型做的,因此它可以用作参考型(在堆上分配) 。当你拆箱时,你会从“箱子”中获得这样的价值。所以不,在这个例子中不会发生这种情况。