• clr via c# 类型基础


    1,类型转换

    • 所有类的基类都是object.且只有一个基类。如果 A派生与B,B派生于C,则A也派生于C。
    • 所有的类都可以隐式转换为其基类并且不会报错 比如 C c1= new A(),虽然c1的真实类型是A。
    • 所有的类都可以显示转换为其派生类,但是必须真实类型一致,否则在运行时报错。 A a1 =(A)c1;

    2,使用 is 和 as 进行转换

       is指定对象是否兼容常见用法:

     static void Main(string[] args)
            {
                object o1 = new object();
                object o2 = new B();
                object o3 = new D();
                object o4 = o3;
                B b1 = new B();
                B b2 = new D();
                D d1 = new D();
                //B b3 = new object();
                //D d2 = new object();
               if(b1 is D)
                {
                    D d2 = (D)b1;//该代码不会运行。
                }
    
            }

    as 则 对对象进行尝试转换,如果失败则为null.

    Employee e = o as Employee;
    if(e!=null)
    {
    //操作e
     }

    3,关键字影响

    C#关键字 类型 方法/属性/事件 常量/字段
    abstract 表示不能构造该类实列 表示派生类必须重写并实现该成员
    virtual 表示派生类可以重写该成员
    override 表示派生类型正重写该成员
    sealed 标识该类不能作为基类 表示这个成员不能被派生类型重写。
    new

    4,CLR如何调用虚方法,属性和事件

    虚方法实列方法静态方法
    call OK OK

    OK

    callvirt OK OK
    • 用call调用静态方法,必须指定方法的定义类型
    • 用call调用实列方法和虚方法,必须指定引用的对象,且不为null
    • 用CallVirt调用非虚方法,变量类型指明了方法的定义类型。
    • 用CallVirt调用虚方法,CLR调查对象实际类型,然后以多态方式调用方法。对象不能是null
    • 在基类重载中,需要将重载的最复杂的类型作为虚方法。

    5,const 和 readonly 的区别

    const 将生成元数据,嵌入到应用程序的元数据中

    readonly 修饰的字段,可以在构造器中进行更改,也可以通过反射技术进行更改,并且其影响应用程序。

    6,实列构造器和类

      构造器.ctor ----用于将实列初始化为良好状态

    如果没有指定构造器,他将简单调用基类的构造器

    public class SomeType{}
    
    // 等价于
    
    public class SomeType{
    	public SomeType():base(){}
    }

    7,类型构造器----类首次被访问时,执行代码

    89public class SomeType{}
    
    // 等价于
    
    public class SomeType{
    	static SomeType():base(){}
    }

    8,操作符重载和转换操作符重载

    可以查看 Decimal类

    9,扩展方法

    扩展方法 -----允许定义一个静态方法,并用实列方法的语法来调用它

    • 必须在非泛型静态类中定义,必须是public static
    • 可以为接口类型和委托类型定义方法
    • class Program
          {
              static void Main(string[] args)
              {
                  A a1 = new A("abc");
                 // a1.ShowA();
                  new[] { "a", "b" }.Show();
                  Console.ReadKey();
              }
          }
          public class A
          {
              public string value { get; set; }
              public A(string b)
              { value = b; }
      
      
      
          }
          public static class A1
          {
              public static void ShowA(this A b1)
              {
                  Console.WriteLine("A"+b1.value);
                  Console.ReadKey();
               }
              public static void Show<T>(this IEnumerable<T> collection)
              {
                  collection.ToList().ForEach(x => Console.WriteLine(x+Environment.NewLine));
              }
          }
  • 相关阅读:
    Linux tcpdump命令详解
    移动开发网站收集
    Struts+2权威指南基于WebWork核心的MVC开发源码下载
    Eclipse+php插件+Xdebug搭建PHP完美开发/调试环境指南
    java相对目录和绝对目录解析
    python学习网站搜集
    window下开发iphone程序环境搭建iphone tool chain
    Windows下编译objectiveC
    java class路径获取
    完全优化MySQL数据库性能的八个方法
  • 原文地址:https://www.cnblogs.com/frogkiller/p/12241835.html
Copyright © 2020-2023  润新知