变量
Field, local variables, and parameters
Field
每个字段的可见性有以下几个级别(可见性逐渐降低):
- public
- protected
- internal
- protected internal
- private
Local variables
Parameter
- in parameter
- 值类型(int, double, string)传入函数,不能改变调用者所处环境下的变量;
- 引用类型(object)传入函数,可以改变调用者所处环境下的变量。
- out parameter 没有复制变量值后再传入,所以对变量的改变将会直接影响调用者所处环境下的变量
- reference parameter 与 out parameter 类似
- params parameter 可变参数,必须是函数的最后一个参数
Types
Value types
值类型存储在栈(stack)中
Reference types
引用类型存储在堆(heap)中。
引用类型包含两部分:指向堆(包含对象)的指针和对象自身。当对象通过构造函数被初始化时,CLR(Common Language Runtime)执行以下下操作:
- 计算堆中需要存储对象的内存大小
- 将数据插入到新开辟的内存空间
- 标记空间结束的位置,以便下一个对象可以存放
- 返回新创建内存空间的一个引用
装箱(boxing):值类型转为引用类型
拆箱(unboxing):引用类型转为值类型
内置C#类型别名和对应的 .NET Framework 类型:
Custom types
自定义值类型使用关键字 sturct 和 enum 声明,自定义引用类型使用关键字 class 声明。
Conversion
根据预定义转换规则,类型之间可以显式或者隐式转换。
- 若类型转换不会丢失信息,则转换是隐式的(即不需要强制类型转换)
- 若从一个基态类转换到继承自它的类,则转换是显式的
- 若从一个接口转换到实现它的类,则转换是显式的
- 若要转换的值不是目标类或目标类的任何派生类的实例,则运行时环境将抛出异常