最近刚刚换了一分工作,在找工作的途中发现自己的基础十分薄弱,好几个面试官都认为我基础薄弱,本人从事游戏开发工作,决定重新学习一下基础知识,顺便也学习一下新的技术知识。好记性不如烂笔头,写下来以便日后查阅(知识点来源于菜鸟编程菜鸟编程)
C#的变量类型分两种值类型和引用类型,其区别如下:
- 值类型在内存的同一个地方存储它们自己和它们的内容。
- 引用类型存储只想内存中的某个其他位置(称为堆)的引用,实际内容存在这个地址下的内存空间。
- 值类型和引用类型的一个主要区别:值类型总包含一个值,而引用类型可以是null,表示它们不包含值。
- 只有string和object类型是简单的引用类型,数组也是隐式的引用类型。我们创建的每一个类都是引用类型。
- 结构类型和类的重要区别:结构类型(struct)是值类型,类是引用类型。
值类型(Value types)
- 声明类型时,系统分配内存来存储值
常用的数据类型以及相关说明:
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | true or false | false |
byte | 8位无符号整数 | 0~255 | 0 |
char | 16位Unicode字符 | U +0000 到 U +ffff | ‘\0’ |
byte | 8位无符号整数 | 0~255 | 0 |
double | 64位双精度浮点型 | (+/-)5.0 * 10-324~(+/-)1.7 * 10308 | 0.0D |
float | 32位单精度浮点型 | -3.4 * 1038~3.4 * 1038 | 0.0f |
int | 32位有符号整数 | -231~231-1 | 0 |
long | 64位有符号整数 | -263~263-1 | 0 |
sbyte | 8位有符号整数 | -128~127 | 0 |
short | 16位有符号整数 | -32768~32767 | 0 |
uint | 32位无符号整数 | 0~232-1 | 0 |
ulong | 64位无符号整数 | 0~264-1 | 0 |
ushort | 16位无符号整数 | 0~216-1 | 0 |
在实际工作中int、bool、float使用最频繁,在定义一些唯一ID时会采用long,在设计配置表时常常会用uint或者ushort。
枚举类型是特有的值类型。
如需得到一个类型或一个变量在特定平台上的准确尺寸,可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。
引用类型(Reference types)
引用了类型不包含存储在变量中的实际数据,单它们包含对变量的引用。它们指的是一个内存位置。内置的引用类型
- object 对象类型
- Dynamic 动态类型
- String 字符串类型
C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待:
string str = @"C:\Windows";
等价于:string str = "C:\\Windows";
C#类型转换
- 隐式类型转换:C# 默认的以安全的方式进行转换,不会导致数据丢失。如:从小的整数转为大的整数类型,从派生类转换为基类;
- 显示类型转换:强制类型转换。(会造成数据丢失);
C#的装箱和拆箱
int x=2;
object y=(object) x;//装箱
x=(int)y;//拆箱
描述的通俗点:
- 装箱 将值类型转换成引用类型
C#中为了让一个值类型转换成一个引用类型,需要进行一次装箱操作,下面看一下装箱操作具体:
1.在托管堆上分配内存
2.值类型的所有字段复制到新分配托管堆内存上
3.返回对象的地址(这个地址是对一个对象的引用,值类型现在是一个引用类型)
注:旧的point对象不变,值类型转换成引用类型的本质是重新建立了一个已装箱的Point对象(引用类型) - 拆箱 将引用类型转换成值类型
拆箱的过程:
1.获取已装箱Point对象中的字段地址
2.将这些字段的值从托管堆中复制声明的Point对象实例pFirst中(pFirst是值类型,在线程栈中分配内存)
C#中提供了List 泛型类,参数是什么类型就存什么类型,与ArrayList比起来可以免去装箱和拆箱的过程,挺高性能