1
第 2章 数据类型
2.1 值类型
2.2 引用类型
2.3 装箱和拆箱
2.4 类型转换
2
表 2-1 C#的值类型
3
2.1.1 简单类型
1.整数类型
整数类型的变量的值为整数。
C#支持八种整数类型,sbyte,byte,short、
ushort,int,uint,long,ulong和 char。
2.布尔类型
布尔类型表示的逻辑变量只有两种取值:
“真”或“假”,在 C#中,分别采用,true”
和,false”两个值来表示,
4
3.字符类型字符包括数字字符、英文字母和表达符号等。
例如:给一个字符变量赋值:
char c = 'A';
char c = '\x0032';
char c = '\u0032';
4.实数类型
( 1)浮点类型单精度( float)和双精度( double)
( 2)十进制类型十进制类型( decimal)适合应用在不能接受舍入误差的计算中,当定义一个 decimal变量并赋值给它时,使用 m下标。
5
2.1.2 结构类型
把一系列相关的变量组织成为一个单一实体的过程,称为生成结构的过程;这个单一实体的类型称为结构类型;每一个变量称为结构的成员。
结构类型的变量采用 struct来进行声明。
对结构成员的访问通过结构变量名,成员名。
6
例,定义职工 worker结构类型:
struct worker {
public string name;
public uint age;
public string phone;
public string address;
};
worker p1;
p1.name =,Tom”;
7
2.1.3 枚举类型定义枚举类型的形式如下:
enum 枚举类型名 { 数据 1,数据 2,…,数据 n};
例如,定义一个名为 color的表示颜色的枚举类型:
enum color{
Red,Green,Blue,White,Black
};
color c1 //定义一个枚举变量 c1;
c1= Green;
8
同样也可以访问枚举成员,其格式为:
枚举名,枚举成员名例如,要访问 color中的 Blue元素,其代码为:
color.Blue
返回目录
9
C#中的引用类型有四种:类、数组、代表和接口。
特殊数值 null是所有引用类型都适用的,并且表示缺乏实例。
当一个引用不为 null时,它始终指向一个特定类型的对象,而且该对象已被堆栈分配。
10
2.2.1 类
1,object 类定义 object类型引用变量的形式为:
object 标识符 [=数值 ];
例如:
object abc1;
object abc2=5.75;
11
2,string 类定义字符串引用变量的形式为:
string 引用标识符 [=”字符串字面值” ];
例如:
string String1=“hello”;
string String2=“hello”+“world”;
char String4=String1[0];
bool a=(String1==String2);
12
2.2.2 数组
数组是一种数据结构,包含于数组中的变量,也称为数组的元素,都有相同的类型,而这个类型被称为数组的类型。
可以使用 new运算符在 C#中创建数组,数组必须先声明再使用。
在数组声明的时候可以对数组元素进行赋值,或者叫做对数组的初始化,也可以在使用的时候进行动态赋值。
在 C#中数组可以是一维的,也可以是多维的,同样也支持矩阵和不规则的数组。
13
例 2-1:创建一个一维 int类型数组,初始化数组元素并且把每个元素打印出来。
using System;
class Test
{
static void Main()
{
int[] arr = new int[5];
for (int i = 0; i < arr.Length; i++)
arr[i] = i * i;
for (int i = 0; i < arr.Length; i++)
Console.WriteLine("arr[{0}] = {1}",i,
arr[i]);
}
14
一个数组的每一维都有相应的长度,这个长度是一个大于或等于零的整数,Array类提供了 Length成员查询数组的长度。
System.Array类型是所有数组类型的抽象基类型,系统中存在从任意数组类型到
System.Array类型的隐式转换。
使用 System.Array类的属性的语句格式为:
数组名,属性名
15
2.2.3 代表
代表( Delegates)是一种指向一个静态方法或一个对象的对象实例和对象方法的数据结构。代表实际上相当于 C#中的函数指针。
定义和使用代表分为三步:声明、实例化和调用。
在声明代表时,只需要指定代表指向的原型的类型,它不能有返回值,也不能带有输出类型的参数。
例如:
delegate void MyDelegate(); //声明一个名为
//MyDelegate的代表,它没有任何参数并且返回
void值
16
2.2.4 接口
接口定义了一个连接,一个类或者结构必须根据它的连接来实现接口。
接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。
17
例如:
interface IExample
{
string this[int index] { get; set; }
event EventHandler E;
void F(int value);
string P { get; set; }
}
public delegate void EventHandler(object
sender,EventArgs e);
返回目录
18
2.3.1 装箱装箱就是将值类型变量隐式地转换为 object
对象类型变量,或转换为任何该值类型所执行的接口类型。具体过程是:把一个值类型装箱,
就是创建一个 object对象类型的实例,并把该值类型的值复制给该实例。
例如:
int val=1000;
object obj=val; //装箱,将 val的值复制给
obj
在装箱后对 val的任何修改均不会影响到 obj
对象的内容 。
19
2.3.2 拆箱拆箱是装箱的逆过程。具体过程是:先确认 object类型实例的值是否为给定值类型的装箱值,然后将这个实例的值复制给新的给定值类型的变量。
例如:
int val=1000;
object obj=val; //装箱
int val1=(int)obj; //拆箱当装箱时,不需要显式地进行强制类型转换;当拆箱时,必须显式地进行类型转换。 返回目录
20
2.4.1 隐式类型转换隐式类型转换是系统默认的、不需要任何声明就可以进行的转换,它是由编译器根据不同类型数据间转换规则自动完成的,又称为自动转换。
例如:
byte a=100;
byte b=a; //相同类型隐式转换
float c=a; //不同类型隐式转换
21
隐式转换遵守“由低级类型向高级类型转换,结果为高级类型”的原则,从而保证计算精度。
隐式数值转换
隐式枚举转换
隐式引用转换
22
2.4.2 显式类型转换显式类型转换就是强制执行从一种数据类型到另一种数据类型的转换,因此也称为强制类型转换,一般用强制类型转换符来实现。
显式类型转换的格式为:
(类型名 )变量或表达式例如:
int i,h;
float j=4.5;
i=(int)j;
h=j;
23
与隐式类型转换相比,显式类型转换不一定总成功,有可能会造成数据信息的丢失或产生异常。
显式转换包括所有的隐式转换。
显式数值转换
显式枚举转换
显式引用转换返回目录