跳到主要内容

任务一 数据类型

知识点​

1.C#中的数据类型如何分类?​

C#中的数据类型分为引用类型和值类型,其划分依据是数据类型中的存储内容。值类型是直接存储值,引用类型存储的是对值的引用。

C# 数据类型
├── 值类型
│ ├── 简单类型
│ │ ├── 整数类型
│ │ ├── 实数类型
│ │ ├── 字符类型
│ │ └── 布尔类型
│ └── 复杂类型
│ ├── 结构类型
│ └── 枚举类型
└── 引用类型
├── 类(对象类型、字符串类型)
├── 接口
├── 委托
└── 数组

子任务一 值类型​

2.整数类型有哪8种?​

类型标识符说明占用位数取值范围
sbyte带符号字节型8-2^7 ~ 2^7-1
byte无符号字节型80 ~ 2^8-1
short带符号短型16-2^15 ~ 2^15-1
ushort无符号短型160 ~ 2^16-1
int带符号整型32-2^31 ~ 2^31-1
uint无符号整型320 ~ 2^32-1
long带符号长整型64-2^63 ~ 2^63-1
ulong无符号长整型640 ~ 2^64-1

所占的二进制位数越多,表示的数值的取值范围越大。

3.实数类型有哪3种?​

类型标识符说明占用位数精度取值范围
float单精度浮点数326~7位数字±(1.5×10^-45 ~ 3.4×10^38)
double双精度浮点数6415~16位数字±(5.0×10^-324 ~ 1.7×10^308)
decimal固定精度的浮点数12828~29位数字±(1.0×10^-28 ~ 7.9×10^28)
  • 一般情况下,包含小数点的数值默认为double类型
  • 数值后添加 f 或 F 强制指定为float类型
  • 数值后添加 m 或 M 强制指定为decimal类型
float theMySum = 9.27f;
decimal myMoney = 1.12m;

decimal类型非常适合金融和货币方面的计算。

4.字符类型是什么?​

字符类型主要用来存储单个字符,采用Unicode字符集表示形式,占用16位(两字节)内存空间。标识符是char。

char ch1 = 'a';

注意:'a' 表示一个字符,"a" 表示一个字符串(虽然只有一个字符,但由于使用双引号,所以是字符串而不是字符)。

5.布尔类型是什么?​

布尔类型数据用于表示逻辑真和逻辑假,标识符是bool。只有两个值:true(真)和 false(假)。

注意:在C#中,bool类型不能直接转换为int类型。例如 int a = (2 < 3) 在C#中是不允许的。

6.简单类型对应的.NET Framework系统类型别名是什么?​

C#类型.NET Framework类型C#类型.NET Framework类型
boolSystem.BooleanuintSystem.UInt32
byteSystem.BytelongSystem.Int64
sbyteSystem.SByteulongSystem.UInt64
decimalSystem.DecimalobjectSystem.Object
doubleSystem.DoubleshortSystem.Int16
floatSystem.SingleushortSystem.UInt16
intSystem.Int32stringSystem.String

7.什么是结构类型?如何声明和使用?​

结构类型是一种自定义类型,可以存储多个不同类型的数据。它是值类型,变量的值保存在栈内存区域。

声明格式:

struct 结构类型名称
{
[字段访问修饰符] 数据类型 字段1;
[字段访问修饰符] 数据类型 字段2;
...
[字段访问修饰符] 数据类型 字段n;
}

示例:

struct Student
{
public int xh; //学号
public string xm; //姓名
public char xb; //性别
public int nl; //年龄
public double cj; //成绩
}

定义变量: Student stu1;

访问字段: stu1.xh(结构变量.字段名)

【例3-1】结构类型应用:

namespace proj2_1
{
class Program
{
struct student //结构类型的定义应放在Main函数的外面
{
public int xh; //学号
public string xm; //姓名
public char xb; //性别
public int nl; //年龄
public double cj; //成绩
}
static void Main(string[] args)
{
student stu1;
stu1.xh = 202200101;
stu1.xm = "李雷";
stu1.xb = '男';
stu1.nl = 17;
stu1.cj = 375.5;
Console.WriteLine("学号为:{0} 姓名为:{1} 性别为:{2} 年龄为:{3} 成绩为:{4}",
stu1.xh, stu1.xm, stu1.xb, stu1.nl, stu1.cj);
Console.ReadLine();
}
}
}

运行结果:202200101 姓名为:李雷 性别为:男 年龄为:17 成绩为:375.5

8.什么是枚举类型?如何声明和使用?​

枚举类型是一种自定义数据类型,允许用符号代表数据。使用enum关键字声明。

声明格式:

enum 枚举名
{
枚举成员1,
枚举成员2,
...
}

示例: enum season { spring, summer, autumn, winter }

默认情况下,第1个枚举成员的值取0,后面的每一个按1递增。

定义变量: season jj1;

赋值: jj1 = season.spring;

【例3-2】枚举类型应用:

namespace proj2_2
{
class Program
{
enum season //枚举类型的定义应放在Main函数的外面
{
spring,
summer,
autumn,
winter
}
static void Main(string[] args)
{
season cj1, xj2, qj3, dj4;
cj1 = season.spring;
xj2 = season.summer;
qj3 = season.autumn;
dj4 = season.winter;
Console.WriteLine("春季为:{0} 夏季为:{1} 秋季为:{2} 冬季为:{3}",
cj1, xj2, qj3, dj4);
Console.ReadLine();
}
}
}

运行结果:春季为: spring 夏季为: summer 秋季为: autumn 冬季为: winter

子任务二 引用类型​

9.object类型是什么?​

object是C#中所有类型(包括所有的值类型和引用类型)的基类,C#中的所有类型都直接或间接地从object类中继承而来。对于一个object类型的变量可以赋任何类型的值。

int x = 100;
object obj1; //定义obj1对象
obj1 = x;
object obj2 = "China"; //定义obj2对象并赋初值

object关键字是System.Object类的别名。

10.string类型是什么?​

string类型表示一个Unicode字符序列,专门用于对字符串进行操作。string是System.String类的别名,在C#中string和String类型是等同的。

子任务三 值类型与引用类型的区别​

11.值类型与引用类型有什么区别?​

  • 值类型:直接存储其值,在栈中操作,编译时分配内存空间,占用预定长的字节数,访问速度快
  • 引用类型:存储对值的引用,在堆中分配存储单元,程序运行中动态分配内存,内存开销大、访问速度稍慢

引用类型类似于银行账户的钱在银行里,住户手中持有存折,要想取钱,需要凭借存折在银行支取。

子任务四 类型转换​

12.什么是隐式转换?​

隐式转换是系统默认的不需要加以声明就可以进行的转换。编译器不需要对转换进行详细的检查就能安全地执行转换。

规则: 任何一个源类型A,只要取值范围包含在目标类型B中,就可以隐式转化为类型B。

C#中支持的隐式转换(表3-4):

源类型目标类型
sbyteshort、int、long、float、double、decimal
byteshort、ushort、int、uint、long、ulong、float、double、decimal
shortint、long、float、double、decimal
ushortint、uint、long、ulong、float、double、decimal
intlong、float、double、decimal
uintlong、ulong、float、double、decimal
longfloat、double、decimal
ulongfloat、double、decimal
charushort、int、uint、long、ulong、float、double、decimal
floatdouble
int i = 5;
long j = i; //隐式转换
double d1 = 12.5f; //隐式转换

13.什么是显式转换(强制转换)?​

显式转换需要用户明确地指定要转换的类型。

格式: (类型标识符)表达式

(int)1.23; //把double类型的1.23转换成int类型,结果为1
(int)2.58m; //结果为2

注意:从float、double、decimal到整数的转换将通过舍入得到最接近的整型值,如果超出目标类型范围则出现转换异常。例如 (int)2e10f 将产生溢出错误。

14.Parse方法如何使用?​

Parse方法可以将特定格式的字符串转换为数值型。

格式: 数值类型名称.Parse(字符串表达式)

int k = int.Parse("200");
float x = float.Parse("200.0");

注意:int.Parse("200.0") 会报错,因为"200.0"的格式不符合int类型。

15.Convert类的方法如何使用?​

Convert类提供了一些方法,将一种基本数据类型转换为另一种基本数据类型。

int k;
k = Convert.ToInt32("97");
char c1 = Convert.ToChar(k);
float f = Convert.ToSingle(k);

Convert类支持的转换类型几乎涵盖C#中所有的基础类型:Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime和String。

16.什么是装箱和拆箱?​

(1)装箱转换: 将一个值类型的数据隐式地转换成一个对象类型的数据。就是创建一个object类型的实例,并把该值类型的值复制给这个object实例。

int i = 10;
object obj = i; //装箱(隐式)
object obj2 = (object)i; //装箱(显式)

(2)拆箱转换: 将一个引用类型的数据显式地转换成一个值类型数据。

int i = 10;
object obj = i; //装箱
int j = (int)obj; //拆箱(必须显式转换)

拆箱转换必须执行显式转换,这是它与装箱转换的不同之处,并且在执行拆箱操作时,要符合类型一致的原则。