17.面向对象-继承-万物之父和装箱拆箱
17.1 知识点
里氏替换知识点回顾
概念
- 父类容器装子类对象
- 作用:方便进行对象存储和管理
- 使用:
is
和as
实例
//父类 可以装子类
class Father
{
}
//子类
class Son : Father
{
public void Speak()
{
}
}
万物之父
万物之父的关键字
object
:object
是Object
的别名,两者都可以使用
万物之父的概念
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