C#中的类型转换.docx
《C#中的类型转换.docx》由会员分享,可在线阅读,更多相关《C#中的类型转换.docx(22页珍藏版)》请在冰豆网上搜索。
C#中的类型转换
C#.Net中的类型转换
(1)
2005-11-1014:
20作者:
边城狂人出处:
【导读】本文是对C#的类型转换的讲解,其内容涉及C#的装箱/拆箱/别名、数值类型间相互转换、字符的ASCII码和Unicode码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值类型和字节数组之间的转换、十六进制数输出以及日期型数据的一些转换处理。
1.装箱、拆箱还是别名
许多C#.NET的书上都有介绍int->Int32是一个装箱的过程,反之则是拆箱的过程。
许多其它变量类型也是如此,如:
short<->Int16,long<->Int64等。
对于一般的程序员来说,大可不必去了解这一过程,因为这些装箱和拆箱的动作都是可以自动完成的,不需要写代码进行干预。
但是我们需要记住这些类型之间的关系,所以,我们使用“别名”来记忆它们之间的关系。
C#是全面向对象的语言,比Java的面向对象都还彻底——它把简单数据类型通过默认的装箱动作封装成了类。
Int32、Int16、Int64等就是相应的类名,而那些我们熟悉的、简单易记的名称,如int、short、long等,我们就可以把它称作是Int32、Int16、Int64等类型的别名。
那么除了这三种类型之外,还有哪些类有“别名”呢?
常用的有如下一些:
bool->System.Boolean(布尔型,其值为true或者false)
char->System.Char(字符型,占有两个字节,表示1个Unicode字符)
byte->System.Byte(字节型,占1字节,表示8位正整数,范围0~255)
sbyte->System.SByte(带符号字节型,占1字节,表示8位整数,范围-128~127)
ushort->System.UInt16(无符号短整型,占2字节,表示16位正整数,范围0~65,535)
uint->System.UInt32(无符号整型,占4字节,表示32位正整数,范围0~4,294,967,295)
ulong->System.UInt64(无符号长整型,占8字节,表示64位正整数,范围0~大约10的20次方)
short->System.Int16(短整型,占2字节,表示16位整数,范围-32,768~32,767)
int->System.Int32(整型,占4字节,表示32位整数,范围-2,147,483,648到2,147,483,647)
long->System.Int64(长整型,占8字节,表示64位整数,范围大约-(10的19)次方到10的19次方)
float->System.Single(单精度浮点型,占4个字节)
double->System.Double(双精度浮点型,占8个字节)
我们可以用下列代码做一个实验:
privatevoidTestAlias(){
//this.textBox1是一个文本框,类型为System.Windows.Forms.TextBox
//设计中已经将其Multiline属性设置为true
bytea=1;charb='a';shortc=1;
intd=2;longe=3;uintf=4;boolg=true;
this.textBox1.Text="";
this.textBox1.AppendText("byte->"+a.GetType().FullName+"\n");
this.textBox1.AppendText("char->"+b.GetType().FullName+"\n");
this.textBox1.AppendText("short->"+c.GetType().FullName+"\n");
this.textBox1.AppendText("int->"+d.GetType().FullName+"\n");
this.textBox1.AppendText("long->"+e.GetType().FullName+"\n");
this.textBox1.AppendText("uint->"+f.GetType().FullName+"\n");
this.textBox1.AppendText("bool->"+g.GetType().FullName+"\n");
}
在窗体中新建一个按钮,并在它的单击事件中调用该TestAlias()函数,我们将看到运行结果如下:
byte->System.Byte
char->System.Char
short->System.Int16
int->System.Int32
long->System.Int64
uint->System.UInt32
bool->System.Boolean
这足以说明各别名对应的类!
2.数值类型之间的相互转换
这里所说的数值类型包括byte,short,int,long,fload,double等,根据这个排列顺序,各种类型的值依次可以向后自动进行转换。
举个例来说,把一个short型的数据赋值给一个int型的变量,short值会自动行转换成int型值,再赋给int型变量。
如下例:
privatevoidTestBasic(){
bytea=1;shortb=a;intc=b;
longd=c;floate=d;doublef=e;
this.textBox1.Text="";
this.textBox1.AppendText("bytea="+a.ToString()+"\n");
this.textBox1.AppendText("shortb="+b.ToString()+"\n");
this.textBox1.AppendText("intc="+c.ToString()+"\n");
this.textBox1.AppendText("longd="+d.ToString()+"\n");
this.textBox1.AppendText("floate="+e.ToString()+"\n");
this.textBox1.AppendText("doublef="+f.ToString()+"\n");
}
译顺利通过,运行结果是各变量的值均为1;当然,它们的类型分别还是System.Byte型……System.Double型。
现在我们来试试,如果把赋值的顺序反过来会怎么样呢?
在TestBasic()函数中追加如下语句:
intg=1;
shorth=g;
this.textBox1.AppendText("h="+h.ToString()+"\n");
结果编译报错:
G:
\Projects\VisualC#\Convert\Form1.cs(118):
无法将类型“int”隐式转换为“short”
其中,Form1.cs的118行即shorth=g所在行。
这个时候,如果我们坚持要进行转换,就应该使用强制类型转换,这在C语言中常有提及,就是使用“(类型名)变量名”形式的语句来对数据进行强制转换。
如上例修改如下:
shortg=1;
byteh=(byte)g;//将short型的g的值强制转换成short型后再赋给变量h
this.textBox1.AppendText("h="+h.ToString()+"\n");
编译通过,运行结果输出了h=1,转换成功。
但是,如果我们使用强制转换,就不得不再考虑一个问题:
short型的范围是-32768~23767,而byte型的范围是0~255,那么,如果变量g的大小超过了byte型的范围又会出现什么样的情况呢?
我们不妨再一次改写代码,将值改为265,比255大10
shortg=265;//265=255+10
byteh=(byte)g;
this.textBox1.AppendText("h="+h.ToString()+"\n");
编译没有出错,运行结果却不是h=265,而是h=9。
因此,我们在进行转换的时候,应当注意被转换的数据不能超出目标类型的范围。
这不仅体现在多字节数据类型(相对,如上例的short)转换为少字节类型(相对,如上例的byte)时,也体现在字节数相同的有符号类型和无符号类型之间,如将byte的129转换为sbyte就会溢出。
这方面的例子大同小异,就不详细说明了。
C#.Net中的类型转换
(2)
2005-11-1014:
20作者:
边城狂人出处:
【导读】本文是对C#的类型转换的讲解,其内容涉及C#的装箱/拆箱/别名、数值类型间相互转换、字符的ASCII码和Unicode码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值类型和字节数组之间的转换、十六进制数输出以及日期型数据的一些转换处理。
3.字符的ASCII码和Unicode码
很多时候我们需要得到一个英文字符的ASCII码,或者一个汉字字符的Unicode码,或者从相关的编码查询它是哪一个字符的编码。
很多人,尤其是从VB程序序转过来学C#的人,会报怨C#里为什么没有提供现成的函数来做这个事情——因为在VB中有Asc()函数和Chr()函数用于这类转换。
但是如果你学过C,你就会清楚,我们只需要将英文字符型数据强制转换成合适的数值型数据,就可以得到相应的ASCII码;反之,如果将一个合适的数值型数据强制转换成字符型数据,就可以得到相应的字符。
C#中字符的范围扩大了,不仅包含了单字节字符,也可以包含双字节字符,如中文字符等。
而在字符和编码之间的转换,则仍延用了C语言的做法——强制转换。
不妨看看下面的例子
privatevoidTestChar(){
charch='a';shortii=65;
this.textBox1.Text="";
this.textBox1.AppendText("TheASCIIcodeof\'"+ch+"\'is:
"+(short)ch+"\n");
this.textBox1.AppendText("ASCIIis"+ii.ToString()+",thecharis:
"+(char)ii+"\n");
charcn='中';shortuc=22478;
this.textBox1.AppendText("TheUnicodeof\'"+cn+"\'is:
"+(short)cn+"\n");
this.textBox1.AppendText("Unicodeis"+uc.ToString()+",thecharis:
"+(char)uc+"\n");
}
它的运行结果是
TheASCIIcodeof'a'is:
97
ASCIIis65,thecharis:
A
TheUnicodeof'中'is:
20013
Unicodeis22478,thecharis:
城
从这个例子中,我们便能非常清楚的了解——通过强制转换,可以得以字符的编码,或者得到编码表示的字符。
如果你需要的不是short型的编码,请参考第1条进行转换,即可得到int等类型的编码值。
4.数值字符串和数值之间的转换
首先,我们得搞明白,什么是数值字符串。
我们知道,在C#中,字符串是用一对双引号包含的若干字符来表示的,如"123"。
而"123"又相对特殊,因为组成该字符串的字符都是数字,这样的字符串,就是数值字符串。
在我们的眼中,这即是一串字符,也是一个数,但计算机却只认为它是一个字符串,不是数。
因此,我们在某些时候,比如输入数值的时候,把字符串转换成数值;而在另一些时候,我们需要相反的转换。
将数值转换成字符串非常简单,因为每一个类都有一个voidToString()方法。
所有数值型的voidToString()方法都能将数据转换为数值字符串。
如123.ToSting()就将得到字符串"123"。
那么反过来,将数值型字符串转换成数值又该怎么办呢?
我们仔细查找一下,会发现short,int,float等数值类型均有一个staticParse()函数。
这个函数就是用来将字符串转换为相应数值的。
我们以一个float类型的转换为例:
floatf=float.Parse("543.21");其结果f的值为543.21F。
当然,其它的数值类型也可以使用同样的方法进行转换,下面的例子可以更明确的说明转换的方法:
privatevoidTestStringValue(){
floatf=54.321F;
stringstr="123";
this.textBox1.Text="";
this.textBox1.AppendText("f="+f.ToString()+"\n");
if(int.Parse(str)==123){
this.textBox1.AppendText("strconverttointsuccessfully.");
}else{
this.textBox1.AppendText("strconverttointfailed.");
}
}
运行结果:
f=54.321
strconverttointsuccessfully.
C#.Net中的类型转换(3)
2005-11-1014:
20作者:
边城狂人出处:
【导读】本文是对C#的类型转换的讲解,其内容涉及C#的装箱/拆箱/别名、数值类型间相互转换、字符的ASCII码和Unicode码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值类型和字节数组之间的转换、十六进制数输出以及日期型数据的一些转换处理。
5.字符串和字符数组之间的转换
字符串类System.String提供了一个voidToCharArray()方法,该方法可以实现字符串到字符数组的转换。
如下例:
privatevoidTestStringChars(){
stringstr="mytest";
char[]chars=str.ToCharArray();
this.textBox1.Text="";
this.textBox1.AppendText("Lengthof\"mytest\"is"+str.Length+"\n");
this.textBox1.AppendText("Lengthofchararrayis"+chars.Length+"\n");
this.textBox1.AppendText("char[2]="+chars[2]+"\n");
}
例中以对转换转换到的字符数组长度和它的一个元素进行了测试,结果如下:
Lengthof"mytest"is6
Lengthofchararrayis6
char[2]=t
可以看出,结果完全正确,这说明转换成功。
那么反过来,要把字符数组转换成字符串又该如何呢?
我们可以使用System.String类的构造函数来解决这个问题。
System.String类有两个构造函数是通过字符数组来构造的,即String(char[])和String[char[],int,int)。
后者之所以多两个参数,是因为可以指定用字符数组中的哪一部分来构造字符串。
而前者则是用字符数组的全部元素来构造字符串。
我们以前者为例,在TestStringChars()函数中输入如下语句:
char[]tcs={'t','e','s','t','','m','e'};
stringtstr=newString(tcs);
this.textBox1.AppendText("tstr=\""+tstr+"\"\n");
运行结果输入tstr="testme",测试说明转换成功。
实际上,我们在很多时候需要把字符串转换成字符数组只是为了得到该字符串中的某个字符。
如果只是为了这个目的,那大可不必兴师动众的去进行转换,我们只需要使用System.String的[]运算符就可以达到目的。
请看下例,再在TestStringChars()函数中加入如如下语名:
charch=tstr[3];
this.textBox1.AppendText("\""+tstr+"\"[3]="+ch.ToString());
正确的输出是"testme"[3]=t,经测试,输出正确。
6.字符串和字节数组之间的转换
如果还想从System.String类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了。
为了进行这样的转换,我们不得不借助另一个类:
System.Text.Encoding。
该类提供了bye[]GetBytes(string)方法将字符串转换成字节数组,还提供了stringGetString(byte[])方法将字节数组转换成字符串。
System.Text.Encoding类似乎没有可用的构造函数,但我们可以找到几个默认的Encoding,即Encoding.Default(获取系统的当前ANSI代码页的编码)、Encoding.ASCII(获取7位ASCII字符集的编码)、Encoding.Unicode(获取采用Little-Endian字节顺序的Unicode格式的编码)、Encoding.UTF7(获取UTF-7格式的编码)、Encoding.UTF8(获取UTF-8格式的编码)等。
这里主要说说Encoding.Default和Encoding.Unicode用于转换的区别。
在字符串转换到字节数组的过程中,Encoding.Default会将每个单字节字符,如半角英文,转换成1个字节,而把每个双字节字符,如汉字,转换成2个字节。
而Encoding.Unicode则会将它们都转换成两个字节。
我们可以通过下列简单的了解一下转换的方法,以及使用Encoding.Default和Encodeing.Unicode的区别:
privatevoidTestStringBytes(){
strings="C#语言";
byte[]b1=System.Text.Encoding.Default.GetBytes(s);
byte[]b2=System.Text.Encoding.Unicode.GetBytes(s);
stringt1="",t2="";
foreach(bytebinb1){
t1+=b.ToString("")+"";
}
foreach(bytebinb2){
t2+=b.ToString("")+"";
}
this.textBox1.Text="";
this.textBox1.AppendText("b1.Length="+b1.Length+"\n");
this.textBox1.AppendText(t1+"\n");
this.textBox1.AppendText("b2.Length="+b2.Length+"\n");
this.textBox1.AppendText(t2+"\n");
}
运行结果如下,不说详述,相信大家已经明白了。
b1.Length=6
6735211239209212
b2.Length=8
6703502371390138
将字节数组转换成字符串,使用Encoding类的stringGetString(byte[])或stringGetString(byte[],int,int)方法,具体使用何种Encoding还是由编码决定。
在TestStringBytes()函数中添加如下语句作为实例:
byte[]bs={97,98,99,100,101,102};
stringss=System.Text.Encoding.ASCII.GetString(bs);
this.textBox1.AppendText("Thestringis:
"+ss+"\n");
运行结果为:
Thestringis:
abcdef
C#.Net中的类型转换(4)
2005-11-1014:
20作者:
边城狂人出处:
【导读】本文是对C#的类型转换的讲解,其内容涉及C#的装箱/拆箱/别名、数值类型间相互转换、字符的ASCII码和Unicode码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值类型和字节数组之间的转换、十六进制数输出以及日期型数据的一些转换处理。
7.各种数值类型和字节数组之间的转换
在第1条中我们可以查到各种数值型需要使用多少字节的空间来保存数据。
将某种数值类型的数据转换成字节数组的时候,得到的一定是相应大小的字节数组;同样,需要把字节数组转换成数值类型,也需要这个字节数组大于相应数值类型的字节数。
现在介绍此类转换的主角:
System.BitConverter。
该类提供了byte[]GetBytes(...)方法将各种数值类型转