c# 所有类型都从Object类型派生
CLR要求每一个类型都最终从object类型派生,如下: class Typer {} === class Typer :object {} 上面是完全相等的。 所有的类型最终从object派生,每一个类型都有一组最基本的方法: Equals:如果两个对象相等,返回True GetHashCode:
CLR要求每一个类型都最终从object类型派生,如下: class Typer {} === class Typer :object {} 上面是完全相等的。 所有的类型最终从object派生,每一个类型都有一组最基本的方法: Equals:如果两个对象相等,返回True GetHashCode:
CLR允许将一个对象转换为它的实际类型,或者它的基类型。 在C#中,可将一个对象隐式转换为它的基类型,将对象转换成派生类型需要显示转换。例: object o = new Emplee(); Emplee e = (Emplee)o; 但是如果将一个对象转换成自己的派生类型是,会运行时报错: obj
使用类的全权名: System.Text.StringBuilder sb = new System.Text.StringBuilder(); 上面的写法很繁琐,使用using语句引入命名空间: using System.Text; StringBuilder sb = new StringBui
CLR支持两种类型:引用类型和值类型。 引用类型总是从托管堆上分配的。 c#中的New操作符返回对象的内存地址。 引用对象的注意点: 1、内存从托管堆中分配 2、堆上分配对象,有一些额外的操作,影响一些性能的 3、从托管堆中分配一个对象时,可能强制执行一次垃圾回收。 CLR中的值类型是轻量级的。不需
它的值是在编译时确定的。编译器将常量保存到程序集的元数据中,所有只能是编译器认识的基元类型作为常量。 常量被看成类的一部分,是看出静态成员。 代码引用一个常量符号,会在定义常量的元数据中查找该符号,提取之,并嵌入代码,生成的IL中是值本身。 在c#中使用的是const关键字。 字段:已一种数据成员,
创建一个引用类型的实例时, 首先为实例的数据字段分配内存, 然后初始化对象的附加字段(对象指针、同步块索引), 最后调用类型中定义的实例构造器来设置对象的初始化状态。 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配所有字段的内存总是被先归零或为null。 实例构造器永远不能被继续。如果
引用类型包含值类型字段,引用类型初始化后,值类型默认会被初始化为0、Null。 CLR允许为值类型定义构造器,但是构造器的调用,就必须显式的写代码来调用它们。 CLR不允许为值类型定义无参构造器。只能定义有参构造器,并且构造器中必须为值类型中的所有字段全部赋值,否则报错。 c#中虽然没有无参构造器,
主要作用是:设置类型中静态字段的初始化。类型构造器不一定要在类中定义,但是最多也只能有一个。例: 实现代码如下: class SomeType{ static SomeType(){} }jit编译器在编译一个方法时,会查看代码引用哪些类型。任何类型定义了类型构造器,jit编译器都会检查当前AppD
重新指定分配默认值的参数时,可以显式地为指定参数名称赋值,隐式指定的时候,是根据方法参数的顺序,靠c#编译器的推断。 代码示例: 实现代码如下: void M(int x=9,string s="a",DateTime dt = default(DateTime)) {...} Main() { M
声明一个可变数量的参数: 实现代码如下: Static int Add(params int[] values) { int sum = 0; if(value != null) { for(int x = 0;x<values.Length;x++) sum += values[x]; }