《C#从入门到项目实践》笔记4

第4章 C#程序开发基础——数据类型与运算符

声明

本博客中的源代码由于电脑系统问题,均未编译调试过,都是按照《C#从入门到项目实践》一书人工敲上去的(为了练手速),待重装完系统安装了软件之后,立马马上调试修改。

4.1 数据类型概述

在C#中有两种基本类型,分别是值类型和引用类型。而值类型还可以细分为内置值类型、结构和枚举;引用类型可以细分为类类型、接口以及委托等。
基本数据类型
1.值类型
内置的值类型就是整型、浮点型和bool类型等,而结构是一种特殊的值类型,它是抽象类型System.ValueType的直接派生类,而System.ValueType本身又是直接从System.Object派生的,所以结构体拥有值类型所有的特权和限制。
如果需得到一个类型或一个变量在特定平台上的准确空间大小,可以使用sizeof方法。表达式sizeof(type)可以产生以字节为单位的存储对象或类型的存储空间大小。
2.引用类型
引用类型变量又称为对象,可存储对实际数据的引用。内置的引用类型有对象类型、动态类型和字符串类型。
(1)对象类型的关键字是object,也就是System.Object的别名。在C#的统一类型系统中,所有类型都是直接或间接从Object继承的。可以将任何类型的值赋给object类型的变量。但是,在分配值之前,需要先进行类型转换。
例如:定义object类型的变量用于接收任何数据类型的值。

using System;
namespace Progect
{
   
	class Program
	{
   
		static void Main(string[] args)
		{
   
			object age, name, height, sex;		//定义4个object变量
			age = 16;							//整型赋值成功
			name = "周小红";						//string类型赋值成功
			height = 152.32;					//double类型赋值成功
			sex = '女';							//char类型赋值成功
			Console.WriteLine("年龄:{0}\t姓名:{1}\t身高:{2}\t性别:{3}", age, name, height, sex);
		}
	}
}

object类型
本例演示了object类型的变量如何在.NET Framework中使用Object的方法。在代码中首先定义四个object类型的变量,分别为age、name、height和sex;然后分别赋予整型值、字符串值、浮点值和字符值;最后进行输出。
(2)动态类型的关键字是dynamic,该类型的作用是绕过编译时类型检查,改为在运行时解析这些操作。dynamic类型简化了对COM AP(I例如OfficeAutomation API)、动态API(例如IronPython库)和HTML文档对象模型(DOM)的访问。
在大多数情况下,dynamic类型与object类型的行为类似。但是,如果操作包含dynamic类型的表达式,那么不会通过编译器对该操作进行解析或类型检查。dynamic类型只在编译时存在,在运行时则不存在。
例如:对dynamic类型的变量与object类型的变量进行对比。

using System;
namespace Project
{
   
	class Program
	{
   
		static void Main(string[] args)
		{
   
			dynamic dyn = 1;
			object obj = 1;
			//编译时的类型
			Console.WriteLine(dyn.GetType());
			Console.WriteLine(obj.GetType());
		}
	}
}

dynamic类型
本例演示了dynamic的用法。在代码中首先定义dynamic类型的变量dyn和object类型的变量obj,并对它们都赋值为1;然后使用GetType()方法输出代码编译时两个变量的数据类型。
(3)字符串类型的关键字是string,也就是System.String的另外一个名字。string类型是一个字符序列(0个或更多的Unicode字符)。“+”运算符用于连接两个或更多的字符串。
例如:

string str = "Hello" + "World";		//输出Hello World

3.装箱和拆箱(不能理解)
装箱和拆箱是值类型和引用类型之间相互转换时要执行的操作。
(1)装箱在值类型向引用类型转换时发生。
例如:

object obj = 1;

这行语句将整型常量1赋给object类型的变量obj;众所周知,常量1是值类型,值类型是要放在栈上的,而object是引用类型,它需要放在堆上;所以,执行装箱操作时不可避免地要在堆上申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间上,这肯定是要消耗内存和CPU资源的。
(2)拆箱在引用类型向值类型转换时发生。
例如:

object obj = 5;
int value = (int)obj;

这两行代码会执行一次装箱操作将整型数字常量5装箱成引用类型object变量obj;然后又执行一次拆箱操作,将存储到堆上的引用变量obj存储到局部整型变量value中。拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用类型值转换为值类型并赋给值类型变量。

4.2 数据类型之间的转换

类型转换是把数据从一种类型转换为另一种类型。在C#中,转换分为隐式转换和显式转换。

4.2.1 隐式转换

隐式类型转换就是指C#默认的以安全方式进行的转换,不会导致数据丢失。隐式转换可能会在许多情况下出现,包括方法调用和赋值语句。如下表所示列出了预定义隐式转换的数据类型。
隐式类型转换表
例如,将int类型的值隐式转换成long型。

int i = 100;		//声明一个整型变量i并初始化为100
long j = i;			//隐式转换成long型

关于隐式类型转换,需要注意以下几点。
(1)在从int、uint、long或ulong转换为float,以及从long或ulong转换为double时,可能会丢失精度。
(2)不存在针对char类型的隐式转换。
(3)浮点类型与decimal类型之间不存在隐式转换。
(4)int类型的常数表达式可以转换为sbyte、byte、short、ushort、uint或ulong,前提是常数表达式的值处于目标类型的范围内。

4.2.2 显式转换

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

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

显式转换
本例演示了显式类型转换的用法。在代码中,首先定义一个double类型的变量d,并为其赋值为314.159;接着再定义一个int类型的变量i;最后将变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值