CLR Via C#: 类型基础
所有类型都从System.Object派生
- 一下两个类型定义是完全一致的
class Employee
{ }
class Employee : System.Object
{ }
- 由于所有类型最终都从System.Object派生,所以可以保证每个类型的每个对象都有一组最基本的方法。公共实例方法:
- Equals
- GetHashCode
- ToString
- GetType
- 从System.Object派生的类型能访问的受保护方法:
- MemberwiseClone
- Finalize
CLR要求所有对象都用new操作符来创建:
Employee e = new Employee();
- new操作符所做的事情
- 计算类型及其所有基类型中定义的所有实例字段需要的字节数
- 它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零
- 它初始化对象的“类型对象指针”和“同步块索引”成员
- 调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。
- new在执行了所有这些操作后,会返回指向新建对象一个引用(或指针)。在前面的示例代码中,这个引用会保存到变量e中。
- 没有和new操作符对应的一个delete操作符,换言之,没有办法显示释放为一个对象分配的内存。CLR采用了垃圾回收机制,能自动检测到一个对象不再被使用或访问,并自动释放对象的内存。
类型转换:
- CLR允许将一个对象转换为它的(实际)类型或者它的任何基类型。C#不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换。然而将对象转换为它的某个派生类型时,C#要求开发人员只能进行显示转换。
Object o = new Employee(); Employee e = (Employee)o;
- 使用C#的is和as操作符来转型
- is检查一个对象是否兼容于指定的类型,并返回一个Bollean值: true 或false。is操作符永远不会抛出异常。
Object o = new Object();
if (o is Employee)
{
Employee e = (Employee)o;
}
- 在这段代码中,CLR 实际会检查两次对象的类型。if条件一次;if语句内部一次。as操作符简化了这种代码的写法:
Object o = new Object();
Employee e = o as Employee;
if (e != null)
{ }
- 在上面这段代码中,CLR 核实o是否兼容于Employee类型,如果是,as会返回对同一个对象的非null的引用。如果不是,as会返回null。as操作符造成CLR只校验一次对象的类型。
命名空间和程序集:
命名空间(namespace)用于对相关的类型进行逻辑性分组。
namespace ConsoleApplication1
{
public sealed class Program
{
public static void Main(string[] args)
{
string path="";
System.IO.FileMode fm = new System.IO.FileMode();
System.IO.FileStream fs = new System.IO.FileStream(path,fm);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
}
}
}
using System.IO;
using System.Text; namespace ConsoleApplication1
{
public sealed class Program
{
public static void Main(string[] args)
{
string path="";
FileMode fm = new FileMode();
FileStream fs = new FileStream(path,fm);
StringBuilder sb = new StringBuilder();
}
}
}
C#的using指令还支持另一种形式,允许为一个类型 或命名空间创建别名。
using WintellectWidget = Wintellect.Widget;
命名空间和程序集的关系:
- 同一个命名空间中的各个类型可能是再不同的程序集中实现的
- 在一个程序集中,也可能包含不同命名空间中的类型
- 在.NET Framework SDK文档中查找一个类型时, 文档会明确的指出类型所属的命名空间,以及实现了该类型的程序集
CLR Via C#: 类型基础的更多相关文章
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
- NET CLR via C#(第4版)第4章 类型基础
本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系 本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一 ...
- 类型基础---CLR Via C#笔记一
一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...
- [Clr via C#读书笔记]Cp4类型基础
Cp4类型基础 Object类型 Object是所有类型的基类,有Equals,GetHashCode,ToString,GetType四个公共方法,其中GetHashCode,ToString可以o ...
- 重温CLR(三)类型基础
所有类型都从System.Object派生 “运行时”要求每个类型最终都要从System.Object类型派生.也就是说,一下两个类型的定义完全一致. //隐式派生自Object class Empl ...
- C#学习笔记——面向对象、面向组件以及类型基础
C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...
- [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...
- CLR-基元类型以及溢出检查 (CLR-Via-C#) 类型基础
CLR-基元类型以及溢出检查 =========(CLR via C#阅读笔记)======== 基元类型(primitive type): 基元类型也不做过多的解释,举个例子即可清晰的辨别 在j ...
- (CLR-Via-C#) 类型基础
CLR要求每个类型最终都派生自System.Object Object提供的公共方法: Equals: 如果两个对象具有相同的值,就返回true GetHashCode: 返回对象的哈希码 ToStr ...
随机推荐
- 编号中的数学_KEY
题目描述: 从美国州际高速公路建筑者那里,奶牛们引进了一种路径编号系统,来给牧场之间的道 路编号.他们已经把 N(1<=N<=25)个牧场,用 1 到 N 的整数编号.现在他们需要将牧场间 ...
- 从Thread.start()方法看Thread源码,多次start一个线程会怎么样
这篇文章作为Thread类源码剖析的补充,从一个侧面来看Thread源码.也解答了面试高频问题:"多次start一个线程会怎么样?" 答案是:java.lang.IllegalTh ...
- Spring Boot-------JPA——EntityManager构建通用DAO
EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...
- 计蒜客 2017 NOIP 提高组模拟赛(四)Day1 T2 小X的密室
https://nanti.jisuanke.com/t/17323 小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1号房间,而出口在 N号房间. 密室的每 ...
- HDU2066 一个人的旅行 最短路基础
新手熟悉一下迪杰斯特拉... 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Linux硬链接和软连接详解
硬链接: 硬链接是通过索引节点inode来进行链接的(关于inode,http://www.cnblogs.com/ZGreMount/p/7653307.html).在Linux(ext2,ext3 ...
- Intel Core Microarchitecture Pipeline
Intel微处理器近20年从Pentium发展到Skylake,得益于制作工艺上的巨大发展,处理器的性能得到了非常大的增强,功能模块增多,不过其指令处理pipeline的主干部分算不上有特别大的变化, ...
- 【学习】滚动延迟加载插件scrollLoading用法
今天遇到一个很好用的滚动延迟加载的插件,作者是我的偶象大神张鑫旭,其博客为http://www.zhangxinxu.com/. 以前也写过这种效果,用的是lazyload,不过只能实现图片的加载.而 ...
- Java集合框架,未完
一.集合类 集合的由来: 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点:1,用于存储对象的容器.(容器本身就是 ...
- JavaScript适配器模式
适配模式可用来在现有接口和不兼容的类之间进行适配,使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象. 基本理论 适配器模式:将一个接口转换成客户端需要的接口而不 ...