C#数据类型-隐式转换和显示转换,以及对应“栈”和“堆”的关系

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值