类型
- 类型定义了一个值的蓝本
- 变量是一个存储位置,不同时期可能存储不同的值 (常量const 永远表示相同的值)
- c#里所有的值都是类型的实例,值的含义,变量可能拥有的值是什么,都由它的类型决定
自定义类型
可以使用原始类型来构建复杂类型
类型的成员:数据成员 函数成员
构造函数和实例化
- 数据是通过实例化一个类型来创建的
- 预定义的类型直接写Literal就可以被实例化了
- 自定义类型则通过new操作符来创建实例
实例成员vs静态成员
- 操作于类型实例的数据成员和函数成员都交实例成员
- 操作于类型而不是类型实例的数据成员和函数成员叫做静态成员 (static)
- 静态类static class的所有成员都是静态de
隐式转换(implicit)vs 显式转换(explicit)
- implicit不丢失精度的转换 位数低向位数高的转换 子类向父类转换
- explicit有可能会丢失精度 位数高向位数低 需要手动
值类型 vs 引用类型
- 值类型所有的内置类型(数值,字符,bool)和自定义的struct和enum
- 引用类型包含所有的class,数组delegate, interface类型,包括字符串
- 他们的根本区别在于处理内存的方式
- 值类型的赋值: 值类型实例的赋值动作总是复刻了该实例
- 引用类型的变量、常量
- 给引用类型的变量赋值:复制引用,而不是对象实例
- 允许多个变量引用同一个对象
值类型
- 数值型
-- signed interger(sbyth,short, int, long)
-- unsigned (byte, ushort, uint, ulong)
-- 实数 (float, double, decimal) - bool
- char
引用类型
- string
- class
值类型:
public struct Point {
public int X;
public int Y;
}
static void Main()
{
Point p1 = new Point();
p1.X = 7;
Point p2 = new Point();
p1.X = 9;
//p1.X = 9
//p2.X = 7
引用类型
public class Point {
public int X;
public int Y;
}
static void Main()
{
Point p1 = new Point();
p1.X = 7;
Point p2 = new Point();
p1.X = 9;
//p1.X = 9
//p2.X = 9
Null
- null是一个Literal
- 可以把null 赋值给引用,表示该引用不指向任何一个对象
存储开销
值类型
- 值类型的实例所占的内存 = 他的字段需要内存的总和
- CLR会把类型内的字段大小设置为该字段实际大小的整数倍
引用类型
- 需要为 引用和对象单独分配内存
- 对象所占内存 = 其字段所占内存总和 + 额外的管理开销
- 每个对象的引用还需要额外的4/8个字节
网友评论