C#数据类型和运算符(1)

熟悉C#的数据类型。

在C#中有两种基本类型,它们分别是值类型和引用类型。而值类型还可以细分为内置值类型、结构和枚举;引用类型可以细分为类类型、接口以及委托等。

  1. 值类型
    内置的值类型就是整型、浮点型和bool类型等,而结构是一种特殊的值类型,它是抽象类型System.ValueType的直接派生类,而System.ValueType本身又是直接从System.Object派生的,所以结构体拥有值类型所有的特权和限制。
  2. 引用类型
    引用类型变量又称为对象,可存储对实际数据的引用。内置的引用类型有对象类型、动态类型和字符串类型。
  3. 装箱和拆箱
    装箱和拆箱是值类型和引用类型之间相互转换时要执行的操作。
    (1) 装箱在值类型向引用类型转换时发生的。
    (2) 拆箱在引用类型向值类型转换时发生的。

在这里插入图片描述

using System;
namespace Project1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Size of byte:    {0}", sizeof(byte));
            Console.WriteLine("Size of char:    {0}", sizeof(char));
            Console.WriteLine("Size of short:   {0}", sizeof(short));
            Console.WriteLine("Size of int:     {0}", sizeof(int));
            Console.WriteLine("Size of double:  {0}", sizeof(double));
            Console.ReadKey();
        }
    }
}

【程序分析】本例通过使用sizeof方法,计算出byte、char、short、int和double类型在内存中的尺寸。由于sizeof方法计算出的结果是以字节为单位,所以byte是8位,刚好是1个字节,因此输出的结果是1;char是16位,刚好是2个字节;int和short都是32位,刚好是4个字节;最后的double是64位,刚好是8个字节。所以,这5个值类型的存储空间分别为1、2、4、4、8。

Size of byte:    1
Size of char:    2
Size of short:   2
Size of int:     4
Size of double:  8
using System;
namespace Project3
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic dyn = 1;
            object obj = 1;
            // 编译时的类型
            Console.WriteLine(dyn.GetType());
            Console.WriteLine(obj.GetType());
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了dynamic的用法。在代码中首先定义dynamic类型的变量dyn和object类型的变量obj,并对它们都赋值为1;然后使用GetType()方法输出代码编译时两个变量的数据类型。

System.Int32
System.Int32

掌握C#的数据类型转换。

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在C#中,转换分为隐式转换和显式转换。

隐式转换

隐式类型转换就是指C#默认的以安全方式进行的转换,不会导致数据丢失。隐式转换可能会在许多情况下出现,包括方法调用和赋值语句。
关于隐式类型转换,需要注意以下几点。
(1)在从int、uint、long或ulong转换为float,以及从long或ulong转换为double时,可能会丢失精度。
(2)不存在针对char类型的隐式转换。
(3)浮点类型与decimal类型之间不存在隐式转换。
(4)int类型的常数表达式可以转换为sbyte、byte、short、ushort、uint或ulong,前提是常数表达式的值处于目标类型的范围内。

显式转换

当类型转换可能会发生数据丢失时,编译器就会要求执行显式转换。显式转换也称为强制转换。强制转换是显式告知编译器用户打算进行转换,并且用户知道可能会发生数据丢失的一种方式。如果要执行强制类型转换,需要在要转换的值或变量前面的括号中指定要强制转换到的类型。

using System;
namespace Project4
{
    class Program
    {
        static void Main(string[] args)
        {
            double d = 314.159;
            int i;
            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);
            Console.ReadKey();
        }
    }
}

显式转换可能会导致精度降低或导致引发异常,所以需要注意以下几点。
(1)将decimal值转换为整型类型时,此值会向零舍入到最接近的整数值。如果生成的整数值处于目标类型的范围之外,则会引发溢出错误。
(2)从double或float值转换为整型类型时,会截断该值。如果生成的整数值处于目标值范围之外,则结果会取决于溢出检查上下文。在已检查的上下文中,引发溢出错误;而在未检查的上下文中,结果是目标类型的未指定值。(3)将double转换为float时,double值舍入为最接近的float值。如果double值太小或太大,无法匹配目标类型,结果将为零或无穷大。
(4)将float或double转换为decimal时,源值转换为decimal表示形式,并四舍五入到第28位小数后最接近的数。根据源值的值,可能出现以下结果之一:
① 如果源值太小,无法表示为decimal,结果则为零。
② 如果源值为NaN(非数值)、无穷大或太大而无法表示为decimal,则引发溢出错误。
(5)将decimal转换为float或double时,decimal值舍入到最接近的double或float值。

使用Convert进行任意类型转换

类型如果是相兼容的两个变量,则可以使用隐式类型转换或者强制类型转换,但是,如果两个变量不兼容,比如说string和int或者string和double类型,这个时候用户就需要一种名叫Convert的转换工厂进行转换。

using System;
namespace Project5
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "123456";		//定义字符串类型的变量str
            int a = Convert.ToInt32(str);		//Convert类的方法将字符串转换为int类型
            Console.WriteLine(a);
            double d = Convert.ToDouble(str);	//Convert类的方法将字符串转换为double类型
            Console.WriteLine(d);
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了Convert类的转换方法。在代码中首先定义字符串类型的变量str,并为其赋值为“123456”;然后通过ToInt32方法,将str的数据分别转换为int类型和double类型。

123456
123456

数值和字符串之间的转换

C#中不仅仅存在数值类型的数据之间的转换,字符串和数值之间也是可以互相转换的,只是方法不同而已。

  1. 数值型转换为字符型
    数值型数据转换为字符串用ToString()方法即可实现。
  2. 字符串转换为数值型
    字符串数据转换为数值型使用Pares()方法。
    (1) 使用int.Pares()方法,将字符串类型转换为整型。
    (2) 使用double.Pares()方法,将字符串类型转换为双精度浮点型。
    (3) 使用float.Pares()方法,将字符串类型转换为单精度浮点型。

Convert.ToInt32()、(int)与int.Parse()的区别

C#中数据转换的方法很多,本节主要讲解Convert.ToInt32()、(int)与int.Parse()的区别。在实际开发项目的过程中,需要被转换的类型大概分为以下三大类:
(1) 对null值进行类型转换。
对于空值null,从运行报错的角度讲,(int)强制转换和int.Parse()都不能接受null;Convert.ToInt32()其实是在转换前先做了一个判断,参数如果为null,则直接返回0。
(2) 转换数字类型,主要测试double和long类型。
针对于浮点型的取舍问题,浮点型只有Convert.ToInt32()和(int)能进行转换,但是也是进行取舍了的。Convert.ToInt32()采取的取舍是进行四舍五入,而(int)则是截取浮点型的整数部分,忽略小数部分。
(3) 转换字符串类型。
Convert.ToInt32()可以转换多种类型(例如非数字类型bool、DateTime等),int.Parse()只能是整型字符串类型(即各种整型ToString()之后的形式,不能为浮点型,否则int.Parse()就会出现输入的字符串格式不正确的错误),(int)只能是数字类型(如float、int、uint等)。

using System;
namespace Project6
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 75;
            float b = 53.005f;
            double c = 2345.7652;
            string str1, str2, str3;
            Console.WriteLine("数值型转换为字符型:");
            str1 = a.ToString();
            str2 = b.ToString();
            str3 = c.ToString();
            Console.WriteLine("str1={0}\nstr2={1}\nstr3={2}", str1, str2, str3);
            Console.WriteLine("字符串转换为数值型:");
            int x = int.Parse(str1);
            float y = float.Parse(str2);
            double z = double.Parse(str3);
            Console.WriteLine("x={0}\ny={1}\nz={2}", x, y, z);
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了数值和字符串之间的转换。在代码中,首先定义三个变量a、b、c,并对它们初始化赋值;接着调用ToString方法,将这三个变量转换为字符串;最后再调用Parse方法,将转换后的字符串转成数值型数据。

数值型转换为字符型:
str1=75
str2=53.005
str3=2345.7652
字符串转换为数值型:
x=75
y=53.005
z=2345.7652

熟悉其他常用类型。

掌握C#的运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值