C# Object 类型

 我来答
大沈他次苹0B
2022-06-23 · TA获得超过7332个赞
知道大有可为答主
回答量:3059
采纳率:100%
帮助的人:178万
展开全部

本文内容来自微软 MVP solenovex 的视频教程—— 真会C#?- 第3章 创建类型 ,大致和第 7 课—— object 类型 对应。可在 GitHub 中查看 C# 视频教程的配套PPT

本文主要包括以下内容

object(System.Object)是所有类型的终极父类。所有类型都可以向上转换为object。

object是引用类型,但值类型可以转化为object,反之亦然。(类型统一)。

在值类型和 object 之间转化的时候,CLR 必须执行一些特殊的工作,以弥合值类型和引用类型之间语义上的差异,这个过程就叫做 装箱 拆箱

装箱就是把值类型的实例转化为引用类型实例的动作,目标引用类型可以是 object,也可以是某个接口。

拆箱正好相反,把那个对象转化为原来的值类型。 int y = (int)obj; // Unbox the int

拆箱需要显式的转换。运行时会检查这个值类型和object对象的真实类型是否匹配,如果不匹配就抛出InvalidCastException。

注意:装箱对于类型统一是非常重要的。但是系统不够完美,数组和泛型只支持引用转换,不支持装箱。

装箱会把值类型的实例复制到一个新的对象,拆箱会把这个对象的内容再复制给一个值类型的实例。

C# 的程序既会做静态的类型检查(编译时),也会做运行时的类型检查(CLR)。

静态检查:不运行程序的情况下,让编译器保证你程序的正确性。 int x = "5"; 运行时的类型检查由CLR执行,发生在向下的引用转换或拆箱的时候。

运行时检查之所以可行是因为:每个在 heap 上的对象内部都存储了一个类型 token。这个 token 可以通过调用 object 的 GetType() 方法来获取。

所有 C# 的类型在运行时都是以 System.Type 的实例来展现的,两种方式可以获得System.Type对象:

GetType 是在运行时被算出的,typeof 是在编译时被算出(静态)(当涉及到泛型类型参数时,它是由 JIT 编译器来解析的)。

System.Type 的属性有:类型的名称,Assembly,基类等等。

ToString() 方法会返回一个类型实例的默认文本表示。所有的内置类型都重写了该方法。

可以在自定义的类型上重写 ToString() 方法,如果你不重写该方法,那就会返回该类型的名称。

当你调用一个被重写的 object 成员的时候,例如在值类型上直接调用 ToString() 方法,这时候就不会发生装箱操作,但是如果你进行了转换,那么装箱操作就会发生。

Built-in reference types (C# reference)
Object Class
Boxing and Unboxing (C# Programming Guide)
Type-testing and conversion operators (C# reference)
Object.GetType Method
Type Class
Object.ToString Method

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式