- C++给开发者的选项更加底层,C#不具备这些选项,但更安全
- C#基于CLR【公共语言进行时】
1,存储指定长度的数据,向系统申请指定长度的内存
2,存储指定类型的数据(一个字节包括8个bite位)
C#中的整形 (有符号整形)int 2的31次方~2的负31次方
short 2的15次方~2的负15次方
Sbyte 2的7次方~2的负7次方
long 2的63次方~2的负63次方
(无符号整形-都是正数)uint 2的31次方
ushort 2的15次方
byte 2的7次方
ulong 2 的63次方
C#中的浮点型float 4字节
double 8字节
C#中的bool 型bool 1字节 用来存放true false
C#中的字符型Char 2字节
C#中的类型转换- 占用内存较长的变量,转换成占用内存较少的变量需要强转,在变量前添加目标类型,可能出现数据变更
- 占用内存较少的变量,转换成占用内存较多的变量不需要强转
- 高精度转低精度数据类型需要强转
- 低精度转高精度不需要强转
- 字符转算术数据不需要强转——保存的是ASCII码
- 算术数据转字符需要强转——保存的是ASCII码对应的字符
- 算术数据类型转string 需要通过ToString( )或者""+变量
- char 转string 不需要强转
- string 转算术数据类型 需要通过Prase(字符串)
- 值类型的数据存储在栈区,引用类型的数据存储在堆区,而内存单元中只存放堆中对象的地址
- 值类型存取速度快,引用类型存储数据慢
- 值类型表示实际数据,引用类型表示指向存储在堆中的数据的指针或引用
- 值类型继承于System ValueType,引用类型继承于System Object
- 栈的内存分配是自动释放,堆的内存由GC来释放
- 值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址
- 算术运算符:+ - & / % ++ –
- 逻辑运算符:&&同真为真, ||同假为假 ! 反判真假
- 条件运算符:> < >= <= == !=
- 赋值运算符:=
- 三目运算符:= 条件? a值,b值
装箱是值类型转换为引用类型时发生的
拆箱在引用类型转化为值类型时发生的
装箱过程:首先在托管堆中为新生成的引用对象分配内存【大小为值类型,实例大小加上一个方法表指针和一个SyncBlackindex】
然后将值类型的数据拷贝到刚刚分配的内存中
返回托管堆中新分配的对象的地址
拆箱过程:首先获取托管堆中属于值类型的那部分字段的地址,这一步是严格意义上的拆箱
将引用对象中的值拷贝到位于栈上的值类型实例中
为什么要装箱?当需要一个支持任意类型的通用数据时,定义Object 后传入值类型需要装箱
装箱拆箱对执行效率的影响:装箱生成全新的引用对象,会有时间损耗,降低效率,应尽量避免装箱
接口和抽象类 区别:- 抽象类可以有构造方法,接口不能有构造方法
- 抽象类中可以有普通成员变量,接口中没有普通成员变量
- 抽象类中可以包含静态方法,接口中不能含有静态方法
- 一个类可以实现多个接口,但是只能继承一个抽象类
- 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类中的子类中实现接口方法
都可以被继承,都不能实例化,都可以包含方法声明,派生类必须实现未实现方法



