类型分类及转换
在说类型分类及转换之前先说一下其他几个小知识点
null,它在C中是大写的,在Java中是小写的,它表示将一个变量设置为“无”,它只能赋给引用类型、指针类型和可空值类型,如
string s = null //string类型是引用类型
再说的是,C#3.0添加的一个关键字var,它用于声明隐式类型的局部变量。用通俗的话讲,就是在声明变量时,只要进行初始化(关于初始化,在关于C的博客中已经说过),该变量就会被定义成相应的数据类型,下面举例
例1:
using System;
class Program
{
static void Main(string[] args)
{
var num = 30;
Console.WriteLine(num);
var f = 99.9;
Console.WriteLine(f);
var ch = 'A';
Console.WriteLine(ch);
var str = "放假了";
Console.WriteLine(str);
//可以看出,在使用var声明变量时,变量的类型会成为与其值相同的数据类型
Console.ReadLine();
}
}
输出结果为:
好了,下面说一下数据类型的分类
以前说过数据类型有int、byte、long、float、double等,前三个可以说成是整数类型,后两个可以说成浮点数类型,但在这里,并不以这样的标准分类,
这里的分类,是以它们的复制方式分类的,这样可以分为两类:值类型和引用类型,值类型数据总是被值复制,引用类型总是被引用复制。
值类型:即变量直接包含值,,就像在C中所说的,变量就是值在内存中的编号,通过变量可以直接找到内存中存储的数据,它在进行复制时,原有的内存空间依然存在,只是多了一个内存副本(即又从内存中新申请了一块内存空间),这两个变量(新变量和被复制的变量),修改任何一个的值令一个都不会改变。
引用类型:引用类型直接包含的是数据存储在内存中的地址,这个类似于C中的指针引用类型指向的内存区称为堆。也因此,引用类型变量复制后,改变一个的值,另一个的值也会被改变。
还有,前面说过,null只能赋给引用类型,因为它可以解释为对“无”的引用,而如果值类型要存储null(这点在数据库编程中很有用,这里不多说),这就要用到可空修饰符(?),下面举例
例2:
using System;
class Program
{
static void Main(string[] args)
{
int? count = null;
Console.WriteLine("输出看看什么样子:{0}\n", count);
Console.WriteLine("什么也没有!");
Console.ReadLine();
}
}
输出结果为:
下面说数据类型之间的转换
首先说的是显示转换,需要用到转型运算符,其实就是C语言中的强制类型转换,格式也一样;C#提供了checked和unchecked这两个关键字来进行检查,使代码更安全,这个有点儿java中的try/catch的一些意思,使用checked后,会对数据进行检查,而使用unchecked后,代码会正常地(即使代码不太安全)执行;其次要说的是隐式转换,其实就是低精度数据向高精度数据转换,这样数据保证了不会丢失精度,下面举例说明
例3:
using System;
class Program
{
static void Main(string[] args)
{
int num = 99;
//short dnum = num; //这样是错误的
short dnum = (short)num; //这里的(short)就是C#所说的转型运算符
Console.WriteLine("显示转换的例子输出:{0}\n", dnum);
int numb = 111;
long lnumb = numb;
Console.WriteLine("隐式转换的例子输出:{0}\n", lnumb);
Console.ReadKey(); //功能与ReadLine()相同
}
}
输出结果为:
例4:
using System;
class Program
{
static void Main(string[] args)
{
int number = int.MaxValue; //前面说过,这是int型数据所表示的最大值
int t = number + 1;
Console.WriteLine("输出t的值为:{0}\n", t);
/* 结果为:
* 输出t的值为:-2147483648
* 这表明数据已经溢出
*/
//checked
//{
// int cnt = int.MaxValue;
// int s = cnt + 1;
// Console.WriteLine("输出t的值为:{0}\n", s);
//}
Console.ReadKey();
}
}
当注释部分取消后,再将上面的代码注释,会显示这样的结果:
出现异常,程序被中断
Unchecked的功能上面说了,使用unchecked后,代码会正常地(即使代码不太安全)执行,需要注意的是unchecked会屏蔽掉checked的功能,这里就不举例了
还有一种就是不进行转型的类型转换(其实在我看来还是类型转换,如果我理解错了,以后会改正),这个需要用到像Parse()这样的方法
下面举个例子
例5:
using System;
class Program
{
static void Main(string[] args)
{
//使用Parse()方法
string str = "101";
int number = int.Parse(str);
Console.WriteLine("字符串转换为整型:number = {0}\n", number);
//使用Convert()方法,它允许从任何基本类型转换为其他基本类型
string misc = "36.987";
//string mis = "0"; //这里出错,因为在C#中bool类型只能是true或false
string mis = "True";
double dbu = Convert.ToDouble(misc);
bool boolean = Convert.ToBoolean(dbu);
bool boomis = Convert.ToBoolean(mis);
//int cnt = Convert.ToInt32(misc); //这里也出错,因为将字符转换为数字类型,需要符合其相应规范
Console.WriteLine("字符串转换为浮点型:dbu = {0}\n", dbu);
Console.WriteLine("字符串转换为布尔型:boolean = {0}\n", boolean);
//Console.WriteLine("字符串转换为整型:cnt = {0}\n", cnt);
/*
上面都是string转换为其它类型,下面是其它类型转换为string,这需要用到ToString()这个方法
*/
bool bo = true;
string textbool = bo.ToString();
Console.WriteLine("textbool的值为:{0}\n", textbool);
int num = 987;
string textint = num.ToString();
Console.WriteLine("textint的值为:{0}\n", textint);
double doub = 13.87;
string textdouble = doub.ToString();
Console.WriteLine("textdouble的值为:{0}\n", textdouble);
Console.ReadKey();
}
}
输出结果为:
这些博客主要是讲我在学C#(我主要看的书是《C#本质论第三版》)的过程中,发现它和C/C++、Java的不尽相同之处,都是自己的见解,也是比较浅显的知识,如有错误,欢迎指出
如无说明,所有程序都是在Visual Studio 2012下运行通过