仓酷云

标题: ASP.NET编程:报告c#中的范例转换 [打印本页]

作者: 小魔女    时间: 2015-1-16 22:39
标题: ASP.NET编程:报告c#中的范例转换
简单的说:.net只有微软一家在做的,微软也不允许别人跟他做相同的工具,所以他就把需要的工具全部封装在.net的平台上了;而java是公开了。转换C#出来也有些日子了,比来因为编程的必要,对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+"
");
this.textBox1.AppendText("char->"+b.GetType().FullName+"
");
this.textBox1.AppendText("short->"+c.GetType().FullName+"
");
this.textBox1.AppendText("int->"+d.GetType().FullName+"
");
this.textBox1.AppendText("long->"+e.GetType().FullName+"
");
this.textBox1.AppendText("uint->"+f.GetType().FullName+"
");
this.textBox1.AppendText("bool->"+g.GetType().FullName+"
");
}
  在窗体中新建一个按钮,并在它的单击事务中挪用该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()+"
");
this.textBox1.AppendText("shortb="+b.ToString()+"
");
this.textBox1.AppendText("intc="+c.ToString()+"
");
this.textBox1.AppendText("longd="+d.ToString()+"
");
this.textBox1.AppendText("floate="+e.ToString()+"
");
this.textBox1.AppendText("doublef="+f.ToString()+"
");
}
  译顺遂经由过程,运转了局是各变量的值均为1;固然,它们的范例分离仍是System.Byte型……System.Double型。如今我们来尝尝,假如把赋值的按次反过去会怎样呢?在TestBasic()函数中追加以下语句:
intg=1;
shorth=g;
this.textBox1.AppendText("h="+h.ToString()+"
");
  了局编译报错:
  G:ProjectsVisualC#ConvertForm1.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()+"
");
  编译经由过程,运转了局输入了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()+"
");
  编译没有堕落,运转了局却不是h=265,而是h=9。
因而,我们在举行转换的时分,应该注重被转换的数据不克不及超越方针范例的局限。这不但表现在多字节数据范例(绝对,如上例的short)转换为少字节范例(绝对,如上例的byte)时,也表现在字节数不异的有标记范例和无标记范例之间,如将byte的129转换为sbyte就会溢出。这方面的例子迥然不同,就不具体申明了。
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+"
");
this.textBox1.AppendText("ASCIIis"+ii.ToString()+",thecharis:"+(char)ii+"
");
charcn=中;shortuc=22478;
this.textBox1.AppendText("TheUnicodeof"+cn+"is:"+(short)cn+"
");
this.textBox1.AppendText("Unicodeis"+uc.ToString()+",thecharis:"+(char)uc+"
");
}
  它的运转了局是
TheASCIIcodeofais: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()+"
");
if(int.Parse(str)==123){
this.textBox1.AppendText("strconverttointsuccessfully.");
}else{
this.textBox1.AppendText("strconverttointfailed.");
}
}
  运转了局:
f=54.321
strconverttointsuccessfully.
5.字符串和字符数组之间的转换
  字符串类System.String供应了一个voidToCharArray()办法,该办法能够完成字符串到字符数组的转换。以下例:
privatevoidTestStringChars(){
stringstr="mytest";
char[]chars=str.ToCharArray();
this.textBox1.Text="";
this.textBox1.AppendText("Lengthof"mytest"is"+str.Length+"
");
this.textBox1.AppendText("Lengthofchararrayis"+chars.Length+"
");
this.textBox1.AppendText("char[2]="+chars[2]+"
");
}
  例中以对转换转换到的字符数组长度和它的一个元素举行了测试,了局以下:
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+""
");
  运转了局输出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+"
");
this.textBox1.AppendText(t1+"
");
this.textBox1.AppendText("b2.Length="+b2.Length+"
");
this.textBox1.AppendText(t2+"
");
}
  运转了局以下,不说胪陈,信任人人已分明了。
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+"
");
  运转了局为:Thestringis:abcdef
7.各类数值范例和字节数组之间的转换
  在第1条中我们能够查到各类数值型必要利用几字节的空间来保留数据。将某种数值范例的数据转换成字节数组的时分,失掉的必定是响应巨细的字节数组;一样,必要把字节数组转换成数值范例,也必要这个字节数组年夜于响应数值范例的字节数。
  如今先容此类转换的配角:System.BitConverter。该类供应了byte[]GetBytes(...)办法将各类数值范例转换成字节数组,也供应了ToInt32、ToInt16、ToInt64、ToUInt32、ToSignle、ToBoolean等办法将字节数组转换成响应的数值范例。
  因为这类转换一般只是在必要举行较渺小的编码/解码操纵时才会用到,以是这里就不具体叙说了,仅把System.BitConverter类先容给人人。
8.转换成十六进制
  任何数据在盘算机外部都是以二进制保留的,以是进制与数据的存储有关,只与输出输入有关。以是,关于进制转换,我们只体贴字符串中的了局。
  在下面的第4条中提到了ToString()办法能够将数值转换成字符串,不外在字符串中,了局是以十进制显现的。如今我们带给它加一些参数,就能够将其转换成十六进制――利用ToString(string)办法。
  这里必要一个string范例的参数,这就是格局申明符。十六进制的格局申明符是"x"大概"X",利用这两种格局申明符的区分次要在于A-F六个数字:"x"代表a-f利用小写字母暗示,而"X"而暗示A-F利用年夜字字母暗示。以下例:
privatevoidTestHex(){
inta=188;
this.textBox1.Text="";
this.textBox1.AppendText("a(10)="+a.ToString()+"
");
this.textBox1.AppendText("a(16)="+a.ToString("x")+"
");
this.textBox1.AppendText("a(16)="+a.ToString("X")+"
");
}
  运转了局以下:
a(10)=188
a(16)=bc
a(16)=BC
  这时候候,我们大概有另外一种需求,即为了显现了局的划一,我们必要把持十六进制暗示的长度,假如长度不敷,用前导的0弥补。办理这个成绩,我们只必要在格局申明符“x”大概“X”后写上暗示长度的数字就好了。好比,要限定在4个字符的长度,能够写成“X4”。在上例中追加一句:
this.textBox1.AppendText("a(16)="+a.ToString("X4")+"
");
  其了局将输入a(16)=00BC。
  如今,我们还要说一说怎样将一个暗示十六进制数的字符串转换成整型。这一转换,一样必要借助于Parse()办法。这里,我必要Parse(string,System.Globalization.NumberStyles)办法。第一个参数是暗示十六进制数的字符串,如“AB”、“20”(暗示十进制的32)等。第二个参数System.Globalization.NumberStyles是一个列举范例,用来暗示十六进制的列举值是HexNumber。因而,假如我们要将“AB”转换成整型,就应当如许写:intb=int.Parse("AB",System.Globalization.NumberStyles.HexNumber),最初失掉的b的值是171。
9.日期型数据和长整型数据之间的转换
  为何要将日期型数据转换为长整型数据呢?缘故原由良多,但就我团体来讲,常常将它用于数据库的日期存储。因为各类数据库对日期型的界说和处置是纷歧样的,各类言语对日期型数据的界说的处置也各不不异,由于,我宁肯将日期型数据转换发展整型再保留到数据库中。固然也能够利用字符串来保留,但利用字符串也会触及到很多成绩,如地区等成绩,并且,它必要比保留长整型数据更多的空间。
  日期型数据,在C#中的介入运算的时分,应当也是转换为长整型数据来运算的。它的长整型值是自0001年1月1日半夜12:00以来所经由工夫以100毫微秒为距离暗示时的数字。这个数在C#的DateTime中被称为Ticks(刻度)。DateTime范例有一个名为Ticks的长整型只读属性,就保留着这个值。云云,要从一个DataTime型数据失掉long型值就十分复杂了,只必要读出DataTime工具的Ticks值便可,如:
longlongDate=DateTime.Now.Ticks;
  DateTime的机关函数中也供应了响应的,从长整型数据机关DateTime型数据的函数:DateTime(long)。如:
DateTimetheDate=newDateTime(longDate);
  但如许关于良多VB6程序员来讲,是给他们出了一道困难,由于VB6中的日期型数据外部是以Double型暗示的,将其转换为长整型后失掉的仅仅是日期,而没偶然间。怎样和谐这两种日期范例呢?
System.DateTime供应了doubleToOADate()和staticDateTimeFromOADate(double)两个函数来办理这个成绩。前者将以后工具按本来的double值输入,后者则从一个double值取得一个System.DateTime工具。举比方下:
privatevoidTestDateTimeLong(){
doubledoubleDate=DateTime.Now.ToOADate();
DateTimetheDate=DateTime.FromOADate(doubleDate);
this.textBox1.Text="";
this.textBox1.AppendText("Doublevalueofnow:"+doubleDate.ToString()+"
");
this.textBox1.AppendText("DateTimefromdoublevalue:"+theDate.ToString()+"
");
}
  运转了局:
Doublevalueofnow:37494.661541713
DateTimefromdoublevalue:2002-8-2615:52:37
10.格局化日期型数据
  编程的过程当中,一般必要将日期型数据依照必定的格局输入,固然,输入了局一定是字符串。为此,我们必要利用System.DateTime类的ToString()办法,并为其指定格局字符串。
  MSDN中,System.Globalization.DateTimeFormatInfo类的概述里对形式字符串有十分具体的申明,因而,这里我只对经常使用的一些格局举行申明,起首请看下表:
d月中的某一天一名数的日期没有前导零
dd月中的某一天一名数的日期有一个前导零
ddd周中某天的缩写称号在AbbreviatedDayNames中界说
dddd周中某天的完全称号在DayNames中界说
M月份数字一名数的月份没有前导零
MM月份数字一名数的月份有一个前导零
MMM月份的缩写称号在AbbreviatedMonthNames中界说
MMMM月份的完全称号在MonthNames中界说
y不包括纪元的年份假如不包括纪元的年份小于10,则显现不具有前导零的年份
yy不包括纪元的年份假如不包括纪元的年份小于10,则显现具有前导零的年份
yyyy包含纪元的四位数的年份
h12小时制的小时一名数的小时数没有前导零
hh12小时制的小时一名数的小时数有前导零
H24小时制的小时一名数的小时数没有前导零
HH24小时制的小时一名数的小时数有前导零
m分钟一名数的分钟数没有前导零
mm分钟一名数的分钟数有一个前导零
s秒一名数的秒数没有前导零
ss秒一名数的秒数有一个前导零
  为了便于人人的了解,无妨尝尝上面的程序:
privatevoidTestDateTimeToString(){
DateTimenow=DateTime.Now;
stringformat;
this.textBox1.Text="";
format="yyyy-MM-ddHH:mm:ss";
this.textBox1.AppendText(format+":"+now.ToString(format)+"
");
format="yy年M日d日";
this.textBox1.AppendText(format+":"+now.ToString(format)+"
");
}
  这段程序将输入了局:
yyyy-MM-ddHH:mm:ss:2002-08-2617:03:04
yy年M日d日:02年8日26日
  这时候候,又呈现一个成绩,假如要输入的文本信息中包括格局字符怎样办?如
format="year:yyyy,month:MM,day:dd";
this.textBox1.AppendText(now.ToString(format)+"
");
  将输入:
2ear:2002,4on下5:08,26a2:26
  这并非我想要的了局,怎样办呢?有举措――
format=""year":yyyy,month:MM,day:dd";
this.textBox1.AppendText(now.ToString(format)+"
");
  看,此次运转了局对了:
year:2002,month:08,day:26
  能够看出,只必要利用单引号大概双引号将文本信息括起来就好。
有专家说:java不是跨平台,java就是平台,这很好的定义了java的特点。有了java,你只需要等待java平台在新平台上移植。这还不错吧!只是,java不是一个平台,而是多个平台。你需要在这个java平台移植到另一个java平台。
作者: 活着的死人    时间: 2015-1-19 14:29
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
作者: 飘飘悠悠    时间: 2015-2-1 12:47
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
作者: 精灵巫婆    时间: 2015-2-7 05:56
提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。
作者: 变相怪杰    时间: 2015-2-20 16:37
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
作者: 简单生活    时间: 2015-3-6 18:33
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
作者: 蒙在股里    时间: 2015-3-13 05:10
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
作者: 小妖女    时间: 2015-3-20 13:38
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2