在编程接口时,我发现我做了很多强制转换或对象类型转换。

这两种转换方法有什么区别吗?如果是的话,是否有成本差异,或者这对我的程序有什么影响?

public interface IMyInterface
{
    void AMethod();
}

public class MyClass : IMyInterface
{
    public void AMethod()
    {
       //Do work
    }

    // Other helper methods....
}

public class Implementation
{
    IMyInterface _MyObj;
    MyClass _myCls1;
    MyClass _myCls2;

    public Implementation()
    {
        _MyObj = new MyClass();

        // What is the difference here:
        _myCls1 = (MyClass)_MyObj;
        _myCls2 = (_MyObj as MyClass);
    }
}

另外,“一般来说”首选的方法是什么?


当前回答

这不是对问题的回答,而是对问题代码示例的注释:

通常你不需要强制转换一个对象,例如IMyInterface到MyClass。接口的伟大之处在于,如果你把一个对象作为实现接口的输入,那么你就不需要关心你得到的是什么类型的对象。

如果你将IMyInterface转换为MyClass,那么你已经假设你得到了一个MyClass类型的对象,使用IMyInterface是没有意义的,因为如果你用其他实现IMyInterface的类来填充你的代码,它会破坏你的代码……

现在,我的建议是:如果你的接口设计得很好,你可以避免大量的类型转换。

其他回答

as关键字的工作原理与兼容引用类型之间的显式强制转换相同,主要区别在于转换失败时它不会引发异常。相反,它在目标变量中产生一个空值。由于异常在性能方面非常昂贵,因此它被认为是一种更好的强制转换方法。

如果不能执行返回null的转换,As永远不会抛出异常(As仅对引用类型操作)。所以使用as基本上相当于

_myCls2 = _myObj is MyClass ? (MyClass)_myObj : null;

另一方面,c风格的强制转换在无法进行转换时抛出异常。

如果不能强制转换,"as"将返回NULL。

之前的强制转换将引发异常。

对于性能而言,引发异常的代价通常更大。

这不是对问题的回答,而是对问题代码示例的注释:

通常你不需要强制转换一个对象,例如IMyInterface到MyClass。接口的伟大之处在于,如果你把一个对象作为实现接口的输入,那么你就不需要关心你得到的是什么类型的对象。

如果你将IMyInterface转换为MyClass,那么你已经假设你得到了一个MyClass类型的对象,使用IMyInterface是没有意义的,因为如果你用其他实现IMyInterface的类来填充你的代码,它会破坏你的代码……

现在,我的建议是:如果你的接口设计得很好,你可以避免大量的类型转换。

as操作符只能用于引用类型,不能重载,如果操作失败,它将返回null。它永远不会抛出异常。

强制转换可以用于任何兼容的类型,它可以重载,如果操作失败,它将抛出异常。

使用哪一种取决于具体情况。首先,这是一个是否要对失败的转换抛出异常的问题。