C#的数据类型分为值类型和引用类型。
值类型
- 值类型直接包含数据
- 整型、浮点型、字符型、布尔型、枚举型、结构体等
- 存放在栈中,每次存取值都会在该内存中操作
整型
sbyte(有符号数,占用1个字节,-27〜27-1),byte(无符号数,占用1个字节,0〜28-1)
short(有符号数,占用2个字节,-215〜215-1),ushort(无符号数,占用2个字节,0〜216-1)
int((默认整型)有符号数,占用4个字节,-231〜231-1),uint(无符号数,占用4个字节,0〜232-1)
long(有符号数,占用8个字节,-263〜263-1),ulong(无符号数,占用8个字节,0〜264-1)
浮点型
float(单精度浮点型,占用4个字节,最多保留7位小数),需要在数值后面加上f或F
double((默认浮点型)双精度浮点型,占用8个字节,最多保留16位小数)
decimal(128 位精确的十进制值,28-29 有效位数,占用16个字节)
字符型
Char(16 位 Unicode 字符,U +0000 到 U +ffff)
布尔型
bool(True 或 False)默认False
引用类型
- 引用类型不包括存储在变量中的实际数据,包含对变量的引用
- 因为指的是一个内存位置,使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反应这种值的变化。
- 类、接口、数组、委托、字符串
- 首先会在栈中创建一个引用变量,然后在堆中创建对象本身,在把这个对象所在的内存的首地址赋给引用变量
对象(Object)类型
是所有数据类型的基类。
当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
int i = 0;
object obj = i;
// double j = (double)obj; // 这里装箱的是int 拆箱也要为int才行
double j = (int)obj;
类型转换
隐式类型转换
这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
显式类型转换
显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
float a = 1.1f;
int i = (int)a;
通过方法进行类型转换
ToString()
所有类型都继承了Object基类,都可以使用ToString()方法。
Parse(), TryParse()
int.TryParse()方法比int.Parse()方法多了一个异常处理,如果出现异常则返回false,并且将输出参数返回0。
Convert类
float num1 = 82.26f;
int integer = Convert.ToInt32(num1);
string str1 = Convert.ToString(num1);
as
as操作符不会做过的转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,那么此转换操作才能成功,而且并不产生新的对象【当不成功的时候,会返回null】。因此用as进行类型转换是安全的。
Object obj1 = new NewType();
NewTYpe newValue = obj1 as NewType;