学习一门语言,不能过于急躁,越是基础的知识越应该好好把握。本章将从C#语言的数据类型和流程控制语句入手,详细介绍C#作为一门开发语言所具备的所有基础知识。
本章主要介绍C#语言的数据类型、运算符和流程控制语句,最后还介绍了开发程序的基本结构。通过本章的学习,读者可以了解C#语言的构成,认识C#语言的编写规范。
2.1 数据类型
数据类型是开发语言的基础,不同的开发语言,数据类型的分类基本上是相同的,所以,有开发语言基础的学习者,通过本节的知识,能对C#的类型有更深入的了解。
本节主要介绍值类型、引用类型、类型转换和拆、装箱操作的原理。
2.1.1 值类型
值类型是将数据保存在堆栈上的简单存储方式。当把一个数据赋给值类型时,其被保存在堆栈上的变量中。堆栈是一个很小的内存区域,通常存储大小固定的数据块。无论存储什么类型的数据,其分配的字节数都是相同的。
值类型可以是任意形式的数据,如字符、数值、结构和枚举等。下一节将会提供一个简单的例子,学习如何辨别值类型。
2.1.2 引用类型
引用类型是将数据保存在堆上的存储方式。当将一个数据给引用类型时,它被保存在堆上的变量中。引用类型的大小不固定,为了可以快速地搜索引用类型数据的值,通过将其地址保存在堆栈上,可以通过地址找到真正数据的所在。引用类型很抽象,就像一个门牌号,可以根据门牌号找到所在的房子。
引用类型一般包括类型、接口、委托和数组等。
下面是一个简单的实例,学习如何辨别值类型和引用类型。
class Program
{
static void Main(string[] args)
{
//引用类型的演示
Study A1 = new Study();
Study A2 = A1;
A2.x = 15;
//值类型的演示
int B1 = 30;
int B2 = B1;
B2 = 25;
Console.WriteLine("A1.x=" + A1.x + ",A2.x=" + A2.x); //引用类型结果
Console.WriteLine("B1= " + B1 + ",B2= " + B2); //值类型结果
}
}
class Study
{
public int x=10; //类的变量,默认为10
}
其中,“A2”是类的对象,是引用类型。当改变其数据时,实际数据也发生了变化,即“A1”中的数据也变了。“B2”是值类型,当其数据发生变化时,并不影响“B1”的数据。上面例子的输出结果如图2.1所示。

图2.1 值类型和引用类型的输出对比
2.1.3 类型转换
在C#中,为了输出和保存的需要,不同的类型之间可以实现转换。本节从基本数据入手,介绍如何在C#中实现基础类型之间的转换。
基础类型一般包括字符型、数值型、日期型。根据类型转换方式的不同,可分为隐式转换和显式转换两种。
隐式转换:在进行类型转换时,需要在代码中明确指出转换后的数据类型。下面的代码演示一个隐式转换的过程。
class Program
{
static void Main(string[] args)
{
double y = 25.505; //定义双精度型
int z = (int)y; //定义整型——实现显式转换
Console.WriteLine("z=" + z ); //显示转换后的值
}
}
显式转换:在进行类型转换时,不需要在代码中明确指出转换后的数据类型,系统会自动进行类型判断,并正确实现类型转换。下面的代码演示一个显式转换的过程。
class Program
{
static void Main(string[] args)
{
int x = 2; //定义整型
double z = x; //定义双精度型——实现隐式转换
Console.WriteLine("z=" + z ); //显示转换后的值
}
}
2.1.4 装箱和拆箱
装箱和拆箱是值类型和引用类型互相转换的过程,是数据类型转换的一种特殊应用。装箱将值类型转换为引用类型,而拆箱正好相反,将引用类型转换为值类型。
下面一个例子演示装箱的过程,其中“object”为引用类型。
class Program
{
static void Main(string[] args)
{
double A1 = 66.6; //定义值
object B1 = A1; //装箱操作
Console.WriteLine("初始值为: {0}, 装箱后的值为{1}", A1, B1.ToString()); //输出结果
}
}
拆箱虽然只是装箱的一个逆向操作,但需要注意类型的显式转换。下面一个例子演示拆箱的过程。
class Program
{
static void Main(string[] args)
{
double A1 = 65.22; //初始值
object B1 = A1; //转化为引用对象后的值
double C1 = (double)B1; // 将引用型对象拆箱,并返回值
Console.WriteLine("引用类型的值为: {0}, 拆箱后的值为{1}", B1, C1); //输出结果
}
}





