所有类型都从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. easyui动态生成列

    需求:一个id对应多个key value 将id作为标识列 key值作为表头 value作为值显示.数据表可分为两张表 param数据表: 下表一个id对应上表多个key及value 如下图 id_p ...

  2. MySQL高级查询(二)

    EXISTS 和NOT EXISTS子查询 EXISTS子查询 语法:   SELECT ……… FROM 表名 WHERE EXISTS (子查询); 例: SELECT `studentNo` A ...

  3. JQuery获取图片大小并控制图片文件上传大小以及上图片文件时如何预览图片

    首先我们来看效果图: 点击上传之后如下: 在这里我获取到文件的大小,并且如果超出我设定的大小,则禁止上传! 不多说,上代码:先看div布局: <div class="imageCont ...

  4. ApplicationContextAware

    1.实现了ApplicationContextAware接口,在Bean的实例化时会自动调用setApplicationContext()方法! 2.通过调用静态方法getBean即可获取 sprin ...

  5. TCP/IP(七)之玩转HTTP协议

    前言 前面一篇的博文简单的介绍了一下属于应用层的HTTP协议,这一篇我将详细的学习HTTP协议,这也是做Web开发中一定要用到的协议.虽然我是做大数据的,但是多学习一点肯定是 没有坏处的.国庆放假7天 ...

  6. Windows下 如何添加开机启动项

    Windows XP,Windows 7: 开始 ----> 所有程序 ----> 启动, 右键打开"启动"这个文件夹, 把想开机自动启动的软件快捷方式拖进去即可. ( ...

  7. 图解clientWidth,offsetWidth,scrollWidth,scrollTop

    新手看到这几个属性,很头疼,参考了网上一些文章,加上自己实践,给出对这几个属性的解释 我把代码贴上来,方便大家验证 在chrome浏览器中,不知为什么图片容器高度比图片高度多了4px,把图片设置为bl ...

  8. 使用wsimport和JAX-WS调用Web Service接口

    本文简单举例说明如何使用wsimport工具和JAX-WS API调用Web Service接口.此方法的优点:使用JDK自带的工具和API接口,无需依赖第三方库. JDK版本:1.8.0_141开发 ...

  9. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

  10. cmd启动,重启,停止IIS命令

    直接使用CMD我们可以操作很多事情,比如启动IIS,重启IIS,停止IIS 重启IIS服务器,开始->运行->cmd (以下列出相关操作命令): iisreset /RESTART 停止后 ...