• 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文档中查找一个类型时, 文档会明确的指出类型所属的命名空间,以及实现了该类型的程序集
  • 相关阅读:
    select poll使用
    linux下tomcat shutdown后 java进程依然存在
    poj 1222 EXTENDED LIGHTS OUT(高斯消元)
    poj 2377 Bad Cowtractors
    C#:总结页面传值几种方法
    从 Racket 入门函数式编程
    程序猿接私活经验总结,来自csdn论坛语录
    什么是SEO?SEO干嘛的?怎么做SEO?
    Java设计模式-观察者模式
    非常特别的一个动态规划新手教程
  • 原文地址:https://www.cnblogs.com/LilianChen/p/7777529.html
Copyright © 2020-2023  润新知