天天看點

類型轉換、類型安全以及is和as的使用

class Program
    {
        static void Main(string[] args)
        {
            //1、類型轉換
            {
                //隐式轉換:不需要轉型,因為new傳回一個Employee對象,而Object是Employee的基類型
                object o = new Employee();

                //顯示轉換:需要轉型,因為Employee派生自Object
                Employee employee = (Employee)o;
            }

            //2、類型安全
            {
                //由于Manager是派生自Employee類型,運作正常
                Manager m = new Manager();
                PromoteEmployee(m);

                //由于DateTime不是派生自Employee類型,運作時會抛出異常
                //DateTime newYears = new DateTime(2019, 8, 25);
                //PromoteEmployee(newYears);
            }

            //3、類型檢查 is ,用is判斷類型相比比較低
            /*
             * 這是由于is操作符首先核實o是否相容于Employee類型,再次核實o是否引用了一個Employee
             * 
             * is類型檢查,永遠不會抛出異常,結果隻會傳回 true  或 false
             * 
             * **/
            {
                object o = new object();
                if ((o is object))
                {

                }
                if ((o is Employee))
                {

                }
            }

            //4、類型轉換 as ,用as判斷類型可提升其性能
            /*
             * as 類型轉換,如果類型轉換成功,則傳回對象,否則傳回null,此轉換方式也永遠不會抛出異常
             * 
             * **/
            {
                object o = new object();
                Employee e = o as Employee;
                if (e != null)
                {

                }
            }

            //5、類型轉行 as ,測試
            {
                object o = new object();
                Employee e = o as Employee;
            }

            //6、類型轉換小測試
            {
                //編譯錯誤,由于是顯示轉換,不一定成功
                //B b1 = new object();
                //D d1 = new object();

                //運作錯誤,由于是顯示轉換,不一定成功
                B b1 = new B();
                D d1 = (D)b1;

                //運作錯誤,由于是顯示轉換,不一定成功
                object o = new object();
                B b2 = (B)o;
            }
            Console.ReadKey();
        }
        //應該将Object參數類型改為Employee類型,這樣在編譯時就能報錯
        static void PromoteEmployee(object o)
        {
            Employee e = (Employee)o;
        }
    }
    class D : B
    {

    }
    class B
    {

    }
    public class Manager : Employee
    {
    }
    public class Employee
    {
    }