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));
            }
        }

clr via c# 类型基础

上一篇:linux下WIFI模块使用:IW工具交叉编译以及配置


下一篇:Linux的目录结构以及shell命令