所有类型都从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#: 类型基础的更多相关文章

  1. [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系

    原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...

  2. NET CLR via C#(第4版)第4章 类型基础

    本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系   本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一 ...

  3. 类型基础---CLR Via C#笔记一

    一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...

  4. [Clr via C#读书笔记]Cp4类型基础

    Cp4类型基础 Object类型 Object是所有类型的基类,有Equals,GetHashCode,ToString,GetType四个公共方法,其中GetHashCode,ToString可以o ...

  5. 重温CLR(三)类型基础

    所有类型都从System.Object派生 “运行时”要求每个类型最终都要从System.Object类型派生.也就是说,一下两个类型的定义完全一致. //隐式派生自Object class Empl ...

  6. C#学习笔记——面向对象、面向组件以及类型基础

    C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...

  7. [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1

    引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...

  8. CLR-基元类型以及溢出检查 (CLR-Via-C#) 类型基础

    CLR-基元类型以及溢出检查   =========(CLR via C#阅读笔记)======== 基元类型(primitive type): 基元类型也不做过多的解释,举个例子即可清晰的辨别 在j ...

  9. (CLR-Via-C#) 类型基础

    CLR要求每个类型最终都派生自System.Object Object提供的公共方法: Equals: 如果两个对象具有相同的值,就返回true GetHashCode: 返回对象的哈希码 ToStr ...

随机推荐

  1. mac 安装Beautiful Soup

    Beautiful Soup是一个Python的一个库,主要为一些短周期项目比如屏幕抓取而设计.有三个特性使得它非常强大: 1.Beautiful Soup提供了一些简单的方法和Python术语,用于 ...

  2. Python uwsgi 无法安装以及编译报错的处理方式

    之前安装uwsgi的时候编译一步有出错,因为比较早,部分错误代码已经找不到了,网上找了部分错误信息, 现把解决方式共享出来. 环境:CentOS release 6.4   Python 2.7.3 ...

  3. 轻松配置httpd的虚拟主机

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  4. spring 内部工作机制(二)

    本章节讲Spring容器从加载配置文件到创建出一个完整Bean的作业流程及参与的角色. Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表, ...

  5. Ubuntu访问window下的磁盘分区出现“Error mounting /dev/sda5 at/media”错误的解决方法

    我装ubuntu之前,电脑上安装了windows 10,为了装ubuntu,在window 10下的磁盘工具分配了30G的磁盘空间.安装完Ubuntu之后,访问window 10的磁盘分区出现“Err ...

  6. PHP MYSQL 搜索周边坐标,并计算两个点之间的距离

    搜索附近地点,例如,坐标(39.91, 116.37)附近500米内的人,首先算出“给定坐标附近500米”这个范围的坐标范围. 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围 ...

  7. 基于LoadRunner11,以wifi热点方式录制APP脚本简单指导

    本想详细写下操作过程,但并不觉着十分必要,通过baidu或我要自学网均能找到相关资料,所以详细操作过程不再赘述,只是把过程中遇到的问题说明下解释下,让大家“录制APP”的路更平坦! 1.如何使用Loa ...

  8. Maven打包Jar

    现状 该项目使用了Maven,并且引入了Spring,包含代码.配置文件.Jar包,使用的是IDEA来作为开发工具,项目的产出物是要打包成一个可运行的Jar包.通过IDEA的打包工具也可以打包成功,只 ...

  9. 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境

    转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...

  10. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...