CLR Via C#: 类型基础

全部类型都从System.Object派生安全

  • 一下两个类型定义是彻底一致的
class Employee
    { }
class Employee : System.Object
    { }
  • 因为全部类型最终都从System.Object派生,因此能够保证每一个类型的每一个对象都有一组最基本的方法。公共实例方法:
    • Equals
    • GetHashCode
    • ToString
    • GetType
  • 从System.Object派生的类型能访问的受保护方法:
    • MemberwiseClone
    • Finalize

 

CLR要求全部对象都用new操做符来建立:ui

Employee e = new Employee();
  •  new操做符所作的事情
    • 计算类型及其全部基类型中定义的全部实例字段须要的字节数
    • 它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的全部字节都设为零
    • 它初始化对象的“类型对象指针”和“同步块索引”成员
    • 调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。
  • new在执行了全部这些操做后,会返回指向新建对象一个引用(或指针)。在前面的示例代码中,这个引用会保存到变量e中。
  • 没有和new操做符对应的一个delete操做符,换言之,没有办法显示释放为一个对象分配的内存。CLR采用了垃圾回收机制,能自动检测到一个对象再也不被使用或访问,并自动释放对象的内存。

 

类型转换:spa

  • 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)用于对相关的类型进行逻辑性分组。code

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;

 

命名空间和程序集的关系:blog

  • 同一个命名空间中的各个类型多是再不一样的程序集中实现的
  • 在一个程序集中,也可能包含不一样命名空间中的类型
  • 在.NET Framework SDK文档中查找一个类型时, 文档会明确的指出类型所属的命名空间,以及实现了该类型的程序集
相关文章
相关标签/搜索