C# 隐式和显式铸造的优缺点

C# 隐式和显式铸造的优缺点,c#,C#,我知道隐式和显式铸造是什么。现在我有一个问题,我找不到满意的答案 与显式转换相比,隐式转换有哪些优点和缺点 这很简单: 优点:更方便 缺点:更复杂的类型系统,由于意外的强制转换而导致的错误源 隐式强制转换必须始终有效,而显式强制转换可能会引发异常。隐式强制转换更方便,因为在强制转换时不必添加显式强制转换。但是,您可能希望选择显式强制转换,以便向开发人员清楚地表明强制转换已经完成 隐式转换很少使用,因为它降低了代码的可读性。显式强制转换更具可读性,但不太方便 最后,根据我的经验,最具可读性的方法

我知道隐式和显式铸造是什么。现在我有一个问题,我找不到满意的答案

  • 与显式转换相比,隐式转换有哪些优点和缺点
  • 这很简单:

    • 优点:更方便
    • 缺点:更复杂的类型系统,由于意外的强制转换而导致的错误源

    隐式强制转换必须始终有效,而显式强制转换可能会引发异常。

    隐式强制转换更方便,因为在强制转换时不必添加显式强制转换。但是,您可能希望选择显式强制转换,以便向开发人员清楚地表明强制转换已经完成

    隐式转换很少使用,因为它降低了代码的可读性。显式强制转换更具可读性,但不太方便


    最后,根据我的经验,最具可读性的方法是提供
    ToTargetType
    方法,除了使用时的可读性之外,IDE中的方法列表也可以很容易地发现这些方法(要查看转换运算符,您需要查看类的源代码)。

    对于变量

    interface IFooBar
    {
        void MakeABarrelRoll();
    }
    
    隐式转换使开发人员每次都不必提及类型。它对于数字数据类型很有用:

    Int32 integerNumber = 20;
    Decimal decimalNumber = integerNumber; //It is OK
    
    但是-应仅在转换完全不同类型的情况下使用显式转换:

    CustomString customString = "This is custom string";
    //Int32 customStringLength = customString; //It is NOT OK
    Int32 customStringLength = (Int32)customString; //It is OK
    
    对于接口

    interface IFooBar
    {
        void MakeABarrelRoll();
    }
    
    隐式接口实现允许所有代码“看到”其方法:

    class FooBar: IFooBar
    {
        public void MakeABarrelRoll()
        {
            //Make a barrel roll here
        }
    }
    
    我们可以直接从object调用它:

    FooBar foobar = new FooBar();
    foobar.MakeABarrelRoll(); //Works
    
    FooBar foobar = new FooBar();
    //foobar.MakeABarrelRoll(); //Does not work
    ((IFooBar)foobar).MakeABarrelRoll(); //Works
    
    显式接口实现仅当对象被显式强制转换到接口时才使其方法打开

    class FooBar: IFooBar
    {
        public void IFooBar.MakeABarrelRoll()
        {
            //Make a barrel roll here
        }
    }
    
    我们可以直接从object调用它:

    FooBar foobar = new FooBar();
    foobar.MakeABarrelRoll(); //Works
    
    FooBar foobar = new FooBar();
    //foobar.MakeABarrelRoll(); //Does not work
    ((IFooBar)foobar).MakeABarrelRoll(); //Works