值类型一般有:int bool shor long float double decimal enum struct
引用类型一般有:string object class interface int[] int[,] delegate
值类型总是分配在它声明的地方
引用类型总是分配在托管堆上
catch{}相当于catch(object){}
不能同时出现catch{}和catch(exception){}因为前面一个最通用
(按引用传递)ref和out的区别在于,out必须在方法内部显示的赋值而ref不用,但ref必须初始化,而out不用,且需要注意的是out和不能实现重载
可以用sizeof()获得值类型的大小
struct声明的结构使用new和直接声明的区别在于,直接声明的没有完成初始化,无法得到值,且报错
值类型都继承自System.ValueType,而System.ValueType又继承自System.Object,主要的区别在于ValueType从写了Equals方法,按位比较而不是按引用
值类型的内存 不由GC控制,作用域结束时,值类型会自行释放
值类型是密封的,因此值类型不可以作为基类,但可以继承接口
接口中不能有静态(static)成员,不能有字段,不能有实现,不能什么类型(class delegate...),总的来说接口(abstract class)就只能有方法,事件,索引器,且方法默认是public abstract
类型的比较通常有Equals() ReferenceEquals(obj,obj) ==/!=,值类型按位,引用类型按引用地址
C# 允许用户自定义类型通过使用 operator 关键字定义静态成员函数来重载运算符。
例如:
public static bool operator ==(Person p1,Person p2){
return true;
}
隐式转换:低级类型向高级类型的转换,需要注意的是值类型到引用类型也是隐式转换(装箱和拆箱)
显示转换:也叫强制类型转换,高级类型
还可以使用implicit(隐式转换)和explicit(显示转换)来定义转换规则
例如:
public static implicit operator int(Person d)
{
return d.age;
}
调用:
Person p = new Person { age = 123 };
int i = p;
形参:被调用的参数
实参:调用的参数