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