文章目录
熟悉C#的数据类型。
在C#中有两种基本类型,它们分别是值类型和引用类型。而值类型还可以细分为内置值类型、结构和枚举;引用类型可以细分为类类型、接口以及委托等。
- 值类型
内置的值类型就是整型、浮点型和bool类型等,而结构是一种特殊的值类型,它是抽象类型System.ValueType的直接派生类,而System.ValueType本身又是直接从System.Object派生的,所以结构体拥有值类型所有的特权和限制。 - 引用类型
引用类型变量又称为对象,可存储对实际数据的引用。内置的引用类型有对象类型、动态类型和字符串类型。 - 装箱和拆箱
装箱和拆箱是值类型和引用类型之间相互转换时要执行的操作。
(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#中不仅仅存在数值类型的数据之间的转换,字符串和数值之间也是可以互相转换的,只是方法不同而已。
- 数值型转换为字符型
数值型数据转换为字符串用ToString()方法即可实现。 - 字符串转换为数值型
字符串数据转换为数值型使用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