1、new后面可以跟匿名类型,使用方法例如:
var student = new {name = “张三”,age = 18};
属性无需定义类型,系统可自动识别(类似于var)
2、invoke()/BeginInvoke()
同步方法:等待Invoke方法里面的线程执行完之后再往下执行,方法体里面的线程是并行的,方法体外的线程会等待。
而BeginInvoke区别于Invoke的特点是不会阻塞当前线程。
3、Assembly:程序集
但凡涉及到反射,必定涉及到程序集,通过反射创建实例对象必须用到CreateInstance()方法,整个反射的核心就是这个CreateInstance()方法
而GetType()、typeof()只是获取类型名。创建一个tpye类型的实例,这个实例实际上是存放类型的说明信息。
4、object类型可以强转为任意类型,因为它是所有类型的父类,父类可以通过里氏转换调用子类的成员。
但是里氏转换得有个前提,就是父类对象里装的必须是子类对象,如果先创建了一个父类的对象,再让
他接受一个子类对象,那此时指向得是子类对象所在的空间。只要不给父类一个子类对象,就不能进行强转,
否则运行时会抛异常(程序不会报错)。
5、readonly 只读关键字
区别于const常量,readonly修饰的字段,其初始化仅是固定了其引用(地址不能修改),但它引用的对象的属性是可以更改的。
而·加上static readonly 就相当于静态字段,若是为值类型且已赋值,则等同于const。若是为引用类型,则无法被实例对象调用。
6、ref、out
值类型也有它自己的地址,即指针,现在用ref和out修饰后,传递的就是这个指针,所以可以实现修改后a,b的值真正的交换。
这就是ref和out给我们带来的好处。区别:ref得先初始化,而一个参数要是加了out且还未赋值,相当于就是通过这个方法初始化这个属性。
ref传进去的参数在函数内部可以直接使用,而out不可(除非在函数体内部,out参数在使用之前赋值)。
7、dymanic、Object、Var?
var: 当使用 var 关键字声明变量时,将在编译时根据初始化字符串推断该变量的类型。 在运行时无法更改该变量的类型。 如果编译器不能推断类型,它会生成一个编译错误。
object:需要使用显式转换将已声明为 object 的变量转换为特定类型。
dymanic动态类型:C# 4 中引入的 dynamic 关键字可使某些传统上依赖于 object 关键字的情形更容易编写和维护。 实际上,动态类型在后台使用 System.Object 类型。但与 object 不同的是,动态类型不需要在编译时执行显式转换操作,因为它仅在运行时识别类型。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。