C# 数据类型
在C#中数据类型可分为以下几类:
- 值类型(value Types)
值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。,包括结构体(数值类型,bool型),枚举,可空类型。 - 引用类型(Reference types)
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。包括数组,用户定义的类,接口,委托,object,字符串。 - 指针类型(Pointer types)
指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。
null可直接赋值给字符串变量,表明变量为空,不指向任何位置,只能将null赋值给引用类型、指针类型和可空值类型。注意:将null值赋值给string变量和为空变量赋值"“不是一个概念,null意味着变量无任何值,而”"意味着有一个"空白字符串"的值。
数据类型转换
1.显示转换
考虑将long值转换成int的情形,long的容量比int大,所以转换可能丢失数据——long值可能大于int能容纳的最大值,有可能造成数据丢失或引发异常的任何转换都需要执行显示转换。
long tempLong=50918309109;
int tempInt=(int)tempLong;
checked和unchecked转换
unchecked//算术运算溢出不会报警,而checked会报警
{
int i = int.MaxValue;
i += 1;
Console.WriteLine(i);
}
2.隐式转型
int类型转换成long类型时,不会发生精度丢失,而且值不会发生根本变化,所以只需指定赋值操作就可以。
int tempLong=5123;
long tempInt=tempLong;
介绍一个int,float,double将string转换为数值类型
string tempString = "9.11E-31";
double tempDouble;
if (double.TryParse(tempString, out tempDouble))//类型转换失败不会引发异常,而是返回false
{
Console.WriteLine(tempDouble);
}
else
{
Console.WriteLine("The text entered was not a valid number");
}
一个类型要么是值类型,要么是引用类型,值类型总是拷贝值,除string外,都是值类型;而引用类型的数据总是拷贝引用,引用类型的变量存储的是对数据存储位置的引用,应用类型的变量分配实际数据的内存区域称为堆(heap)。
关于值类型、引用类型以及“栈”跟“堆”的关系
1.值类型,声明一个值类型的时候,是在“栈”中开辟一个内存空间来存放对应的值,当值类型的值发生改变的时候,则直接修改该内存空间所保存的值。
int n1 = 5;
int n2 = n1;
n2 = 7;
这里首先在“栈”中开辟一个内存空间用来保存 n1 的值 5,接着再在“栈”中开辟一个新的内存空间用来保存 n2 的值 5。然后将 n2 在“栈”中对应的内存空间保存的值修改成 7。
2.引用类型,声明一个引用类型的时候,首先是在“堆”中开辟一个内存空间来存放对应的值,然后在“栈”中开辟一个内存空间用于保存在“堆”中开辟的内存空间的地址。当系统调用引用类型的时候,首先去“栈”中获取到地址,然后根据地址在“堆”中找到对应的内存空间来获取到对应值。像数组这样的引用类型。
补充(1):Convert.ToInt32() 与 int.Parse() 的区别
(1) 这两个方法的最大不同是它们对 null 值的处理方法: Convert.ToInt32(null) 会返回 0 而不会产生任何异常,但 int.Parse(null) 则会产生异常。
(2) 对数据进行四舍五入时候的区别
a. Convert.ToInt32(double value) 如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5 转换为 4,4.5 转换为 4,而 5.5 转换为 6。不过 4.6 可以转换为 5,4.4 转换为 4 。
b. int.Parse(“4.5”) 直接报错:“输入字符串的格式不正确”。
(3) 对被转换类型的区别 int.Parse 是转换 String 为 int, Convert.ToInt32 是转换继承自 Object 的对象为 int 的(可以有很多其它类型的数据)。你得到一个 object 对象,你想把它转换为 int,用 int.Parse 就不可以, 要用 Convert.ToInt32。
补充(2):装箱和拆箱
装箱:将值类型转化为对象类型
int val=8;
object obj=val;
拆箱:之前由值类型转换而来的对象类型再转回值类型。
int val = 8;
object obj = val;
int val2 = (int)obj;