17.万物之父和装箱拆箱

17.面向对象-继承-万物之父和装箱拆箱


17.1 知识点

里氏替换知识点回顾

概念

  • 父类容器装子类对象
  • 作用:方便进行对象存储和管理
  • 使用:isas

实例

//父类 可以装子类
class Father
{

}

//子类
class Son : Father
{
    public void Speak()
    {

    }
}

万物之父

万物之父的关键字

  • objectobjectObject的别名,两者都可以使用

万物之父的概念

  • object是所有类型的基类,它是一个类(引用类型)

万物之父的作用

  • 利用里氏替换原则,用object容器装所有对象
  • 可以用来表示不确定类型,作为函数参数类型

万物之父的使用

主函数内

  • 里氏替换原则:父类装子类
Father father1 = new Son();
//is as 判断真正类型 强转成子类
if (father1 is Son)
{
    (father1 as Son).Speak();
}

//引用类型
object object1 = new Son();
//用is as 来判断和转换即可
if (object1 is Son)
{
    (object1 as Son).Speak();
}

//值类型
object object2 = 1f;
//用括号强转
float float1 = (float)object2;

//特殊的string类型
object object3 = "123123";
//两种强转方式都可以
string string1 = object3 as string;
string string2 = object3.ToString();

//数组
object objectArray1 = new int[10];
//两种强转方式都可以
int[] intArray1 = objectArray1 as int[];
int[] intArray2 = (int[])objectArray1;

装箱拆箱

主函数内

装箱拆箱的发生条件

  • object存值类型(装箱)例如:object object2 = 1f;
  • 再把object转为值类型(拆箱)例如:float float1 = (float)object2;

装箱拆箱的概念

  • 装箱:把值类型用引用类型存储,栈内存会迁移到堆内存中
  • 拆箱:把引用类型存储的值类型取出来,堆内存会迁移到栈内存中

装箱拆箱的优缺点

  • 优点:不确定类型时可以方便参数的存储和传递
  • 缺点:存在内存迁移,增加性能消耗

装箱拆箱的实例

//装箱
object v = 3;//值类型用引用类型存储,这个3会从栈上移动到堆上
//拆箱
int intValue = (int)v;//引用类型存储的值类型取出来,这个3会回到栈上
//可以传任意类型 任意长度参数
TestFun(1, 2, 3, 4f, 34.5, "123123", new Son());

主函数外 class语句块内

  • 测试函数:变长参数加上万物之父,可以传任意类型、任意长度参数
//测试函数 变长参数加上万物之父 可以传任意类型 任意长度参数
static void TestFun(params object[] array)
{

}

总结

  • 万物之父:object
    • 基于里氏替换原则的,可以用object容器装载一切类型的变量
    • 它是所有类型的基类
  • 装箱拆箱
    • object存值类型(装箱)
    • object里面存的值转换出来(拆箱)
    • 好处:不确定类型时可以用,方便参数存储和传递
    • 坏处:存在内存的迁移,增加了性能消耗
    • 不是不用,尽量少用

17.2 知识点代码

using System;

namespace Lesson15_封装_万物之父和装箱拆箱
{
    #region 里氏替换知识点回顾

    //概念:父类容器装子类对象
    //作用:方便进行对象存储和管理
    //使用:is和as。is用于判断,as用于转换

    //实例
    //父类 可以装子类
    class Father
    {

    }

    //子类
    class Son : Father
    {
        public void Speak()
        {

        }
    }

    #endregion

    #region 知识点一 万物之父

    //万物之父的关键字:object object是Object的别名 都可以使用
    //万物之父的概念:object是所有类型的基类,它是一个类(引用类型)
    //万物之父的作用:
    //1.可以利用里氏替换原则,用object容器装所有对象
    //2.可以用来表示不确定类型,作为函数参数类型

    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("万物之父和装箱拆箱");

            //主函数内

            #region 知识点二 万物之父的使用

            //里氏替换原则 父类装子类
            Father father1 = new Son();
            //is as 判断真正类型 强转成子类
            if( father1 is Son )
            {
                (father1 as Son).Speak();
            }

            //引用类型 
            object object1 = new Son();
            //用is as 来判断和转换即可
            if( object1 is Son )
            {
                (object1 as Son).Speak();
            }

            //值类型 
            object object2 = 1f;
            //用括号强转
            float float1 = (float)object2;

            //特殊的string类型
            object object3 = "123123";
            //两种强转方式都可以
            string string1 = object3 as string;
            string string2 = object3.ToString();

            //数组
            object objectArray1 = new int[10];
            //两种强转方式都可以
            int[] intArray1 = objectArray1 as int[];
            int[] intArray2 = (int[])objectArray1;

            #endregion

            #region 知识点三 装箱拆箱
            //装箱拆箱的发生条件
            //用object存值类型(装箱) 例如:object object2 = 1f;
            //再把object转为值类型(拆箱) 例如:float float1 = (float)object2;

            //装箱拆箱的概念
            //装箱:把值类型用引用类型存储,栈内存会迁移到堆内存中
            //拆箱:把引用类型存储的值类型取出来,堆内存会迁移到栈内存中

            //装箱拆箱的优缺点
            //优点:不确定类型时可以方便参数的存储和传递
            //缺点:存在内存迁移,增加性能消耗

            //装箱拆箱的实例
            //装箱
            object v = 3;//值类型用引用类型存储,这个3会从栈上移动到堆上
            //拆箱
            int intValue = (int)v;//引用类型存储的值类型取出来,这个3会回到栈上
            //可以传任意类型 任意长度参数
            TestFun(1, 2, 3, 4f, 34.5, "123123", new Son());
            #endregion
        }

        //主函数外 class语句块内
        //测试函数 变长参数加上万物之父 可以传任意类型 任意长度参数
        static void TestFun( params object[] array )
        {

        }
    }

    //总结:

    //万物之父:object
    //基于里氏替换原则的 可以用object容器装载一切类型的变量
    //它是所有类型的基类

    // 装箱拆箱
    // 用object存值类型(装箱)
    // 把object里面存的值 转换出来(拆箱)
    // 好处:不去定类型时可以用 方便参数存储和传递
    // 坏处:存在内存的迁移 增加了性能消耗
    // 不是不用,尽量少用
}

17.3 练习题

口头描述装箱拆箱

装箱(Boxing)

在C#中,装箱是指将值类型(value type)转换为引用类型(reference type)。这通常发生在将值类型赋值给object类型或System.ValueType类型的变量时。

拆箱(Unboxing)

拆箱是指将引用类型(reference type)转换为值类型(value type)。这通常发生在将装箱后的对象转换回原始值类型时。

注意事项

  • 发生条件: 装箱发生在将值类型转换为引用类型的过程中,拆箱则相反。

  • 好处: 装箱允许在不确定具体类型时使用object来存储任何类型的值,方便存储和传递。

  • 坏处: 装箱和拆箱都涉及内存迁移,会增加性能消耗。因此,在对性能要求较高的情况下,需要谨慎使用装箱和拆箱操作。

用代码描述装箱拆箱

装箱(Boxing)

// 装箱
int i = 10;
object obj = i; // 值类型用引用类型来存储,栈内存迁移到堆内存中

拆箱(Unboxing)

// 拆箱
i = (int)obj; // 把引用存储的值类型取出来放入值对象中,堆内存迁移到了栈内存中

17.4 练习题代码

using System;

namespace Lesson15_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("万物之父和装箱拆箱练习题");
            //主函数内
            #region 练习题一
            //请口头描述什么是装箱拆箱

            //发生条件
            //用object存值类型(装箱)
            //在把object里存的这个值类型转为值对象时(拆箱)

            // 装箱
            // 把值类型用引用类型来存储
            // 栈内存迁移到堆内存中

            // 拆箱
            // 把引用存储的值类型取出来放入值对象中
            // 堆内存迁移到了栈内存中

            // 好处:不确定类型时可以使用 object来存储任何类型 方便存储和传递
            // 坏处:存在内存迁移,增加性能消耗
            #endregion

            #region 练习题二
            //请用代码描述装箱拆箱

            //装箱
            int i = 10;
            object obj = i;//值类型用引用类型来存储,栈内存迁移到堆内存中
            //拆箱
            i = (int)obj;//把引用存储的值类型取出来放入值对象中,堆内存迁移到了栈内存中

            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏