类型与通用语言运行时:System.Object
CLR 要求每个类型最终都要继承自 System.Object 类型
//隐式继承 Object
class Employee {
...
} //显示继承继承 Object
class Employee : System.Object {
...
}
类型定义(C#)描述
System.object 的公有方法
Equals:如果两个对象具有相同的值,方法返回 true
GetHashCode:方法返回对象的值的散列码。如果一个对象被用作散列表的一个键值,那么该对象的类型应该重写 GetHashCode().
ToString:重写该方法使其返回一个表示对象状态的字符串
GetType:方法返回一个类型为继承自Type的对象实例,其标识了该方法所属对象的类型。返回的 Type 对象可以和反射类一起使用来获得类型的元数据信息。(* GetType 方法是一个非虚方法,这可以防止一个类通过重写该方法而隐藏它的类型,从而破坏类型安全)
System.object 的受保护方法
MemberwiseClone:非虚方法,它创建一个新的实例,并将其字段设置为和this对象的字段相同,最后返回新创建的实例引用。关于该方法的更多信息,请参见
Finalize:虚方法,当垃圾收集器判定某个对象为可回收的垃圾时,垃圾收集器会在对象内存被回收前调用此方法。那些内存回收时需要资源清理的类型应该重写该方法。
CLR 要求所有的对象都要用 new 操作符来创建(产生 newobj IL 指令)。下面的语句展示了怎样创建一个 Employee 对象:
Employee e = new Employee("ConstructorParaml");
下面是 new 操作符所执行的工作:
- 从托管堆(managcd heap)中分配中分配指定类型所需的字节来作为存储其对象的内存空间。
- 初始化对象的附加成员(overhead members)。每个对象实例都有两个附加成员(管理对象实例)① 指向类型方法表的指针② SyncBlockIndex
- 传入 new 操作符中的指定参数(上面例子为"ConstructorParaml"),调用类型的实例构造器,虽然大多数语言在编译构造器是都会要求它们调用基类型中相应的构造器,但CLR本身没有这样的要求
在 new 完成了这些所有操作后,它将返回一个指向新创建对象的引用。在上面的例子中,该引用被保存在变量 e 中,其类型为 Employee。
没有和 new 操作符对应的 delete 操作符。也就是说,在CLR中,我们无法显示释放对象所占用的资源。CLR 引入一种垃圾收集环境来自动检测哪些不再被使用或访问的对象,并自动释放它们的内存。
类型与通用语言运行时:System.Object的更多相关文章
- c#通用语言运行时CLR
- 动态语言运行时(DLR)
前言 为了让C#.Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个"DLR(Dynamic Language Runtime:动态语言运行时)& ...
- 承载(Host)通用语言执行时
承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ ...
- 第4章 类型基础 -- 4.1 所有类型都从System.Object派生
4.1 所有类型都从System.Object派生 “运行时”要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证 ...
- Dapr 知多少 | 分布式应用运行时
Intro Dapr 官方团队已于最近(2021.1.17)正式发布Dapr v1.0,Dapr已正式生产可用,可以部署到自托管环境或 Kubernetes 集群.对于绝大多数开发者来说,想必对Dap ...
- 4.1 所有类型都从 System.Object 派生
"运行时"要求各个类型最终都从 System.Object 派生.(显示继承/隐式继承) 提供公共方法(public): Equals 判断两个对象相等,true 表示相等. Ge ...
- Java运行时,各种类型存储介绍
Java的内存分配 Java程序运行时的内存结构分成:方法区.栈内存.堆内存.本地方法栈几种. 方法区 存放装载的类数据信息,包括:基本信息:每个类的全限定名.每个类的直接超类的全限定 ...
- NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”
几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型“System.DateT ...
- 无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。
在一个项目中使用LINQ和EF时出现了题目所示的异常,搜索了很多资料都找不到解决办法,主要是因为EF方面的知识欠缺. 先将情况记录如下,以供以后参考. 查询主要设计两张表,由外键关联: 在进行下面的查 ...
随机推荐
- Phonegap3.4 环境搭建及新建项目
一.环境准备 1.到这里安装Node.js. 2.到这里下载Adroid ADT Bundle for Windows,下载后解压,我的放在:F:\MobileDev\adt-bundle-windo ...
- str*函数和大小端判断
#include <stdio.h> #include <assert.h> size_t mstrlen(const char *s) { assert(s != NULL) ...
- Java到底是不是一种纯面向对象语言?
本文由码农网 – Dee1024原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它. 在我刚开始学习 J ...
- H5离线缓存机制-manifest
简介:Manifest 其实就是web应用的一种缓存机制,主要用于现在webapp应用中,它是浏览器自己的一种机制,随着移动互联网时代的到来,网络可靠性降低,如果我们已经将需要的文件缓存下下来,一旦网 ...
- DevExpress GridControl GridView 导出到 Excel 类
说明: 1>GridView 导出到 Excel (如果分页,只导出当前页数据) 2>GridView 导出到 Excel 3>方法2可以参考DataTable 导出到 Excel ...
- android点滴之标准SD卡状态变化事件广播接收者的注冊
眼下最完整的,须要注冊的动作匹配例如以下: IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); int ...
- 在Java项目中整合Scala
Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...
- [React] React Fundamentals: Add-on ClassSet() for ClassName
To get the add-ons, use react-with-addons.js (and its minified counterpart) rather than the common r ...
- 读<大数据日知录:架构与算法>有感
前一段时间, 一个老师建议我能够学学 '大数据' 和 '机器学习', 他说这必定是今后的热点, 学会了, 你就是香饽饽.在此之前, 我对大数据, 机器学习并没有非常深的认识, 总觉得它们是那么的缥缈, ...
- 标准I/O的替代软件
标准I/O并不完善. 标准I/O库的一个不足之处是效率不高,这与它需要复制的数据量有关.当使用每次一行函数fgets和fputs时,通常需要复制两次数据:一次是在内核和标准I/O缓冲之间(当调用rea ...