中的类型转换

作者: 新闻动态  发布:2020-01-03

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 字节,表示 18人正整数,范围 0 ~ 65,535)
uint -> System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 4,294,967,295)
ulong -> System.UInt64 (无符号长整型,占 8 字节,表示 六拾壹人正整数,范围 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 次方State of Qatar
float -> System.Single (单精度浮点型,占 4 个字节State of Qatar
double -> System.Double (双精度浮点型,占 8 个字节卡塔尔(قطر‎

  大家得以用下列代码做叁个试验:

private void TestAlias() {
    // this.textBox1 是三个文本框,类型为 System.Windows.Forms.TextBox
    // 设计中早就将其 Multiline 属性设置为 true
    byte a = 1; char b = 'a'; short c = 1;
    int d = 2; long e = 3; uint f = 4; bool g = 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(State of Qatar函数,大家将看到运营结果如下:

byte -> System.Byte
char -> System.Char
short -> System.Int16
int -> System.Int32
long -> System.Int64
uint -> System.UInt32
bool -> System.Boolean

  那能够验证各外号对应的类!

  1. 数值类型之间的交互作用转变

  这里所说的数值类型包蕴 byte, short, int, long, fload, double 等,依据这一个排列顺序,各连串型的值依次能够向后自行进行转移。举个例来讲,把二个short 型的多少赋值给贰个 int 型的变量,short 值会自动行转变到 int 型值,再赋给 int 型变量。如下例:

private void TestBasic() {
    byte a = 1; short b = a; int c = b;
    long d = c; float e = d; double f = e;
    this.textBox1.Text = "";
    this.textBox1.AppendText("byte a = " + a.ToString() + "n");
    this.textBox1.AppendText("short b = " + b.ToString() + "n");
    this.textBox1.AppendText("int c = " + c.ToString() + "n");
    this.textBox1.AppendText("long d = " + d.ToString() + "n");
    this.textBox1.AppendText("float e = " + e.ToString() + "n");
    this.textBox1.AppendText("double f = " + f.ToString() + "n");
}  译顺遂通过,运转结果是各变量的值均为 1;当然,它们的等级次序分别还是System.Byte 型……System.Double 型。今后大家来尝试,若是把赋值的相继反过来会怎么啊?在 TestBasic(State of Qatar函数中加进如下语句:

int g = 1;
short h = g;
this.textBox1.AppendText("h = " + h.ToString() + "n");

  结果编写翻译报错:
  G:ProjectsVisual C#ConvertForm1.cs(118卡塔尔: 不能将项目“int”隐式转变为“short”
  其中,Form1.cs 的 118 行即 short h = g 所在行。

  那时候,如若大家坚持要扩充转移,就应该使用强迫类型调换,那在 C 语言中根本谈起,便是应用“(类型名State of Qatar变量名”情势的语句来对数据开展压迫调换。如上例改善如下:

short g = 1;
byte h = (byteState of Qatar 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

short g = 265; //265 = 255 + 10
byte h = (byte) g;
this.textBox1.AppendText("h = " + h.ToString() + "n");

  编译未有出错,运营结果却不是 h = 265,而是 h = 9。
为此,大家在张开调换的时候,应当注意被转移的数额无法高出目的项指标节制。那不但体现在多字节数据类型(相对,如上例的 short卡塔尔国 调换为少字节类型(相对,如上例的 byte卡塔尔国时,也体今后字节数雷同的有暗记类型和无符号类型之间,如将 byte 的 129 转变为 sbyte 就能够溢出。那方面包车型客车例证如出一辙,就不详细表明了。

  1. 字符的 ASCII 码和 Unicode 码

  相当多时候大家要求拿到叁个立陶宛共和国语字符的 ASCII 码,恐怕一个汉字字符的 Unicode 码,恐怕从有关的编码查询它是哪叁个字符的编码。很几个人,极度是从 VB 程序序转过来学 C# 的人,会报怨 C# 里为啥向来不提供现存的函数来做那个业务——因为在 VB 中有 Asc(卡塔尔(قطر‎ 函数和 Chr(卡塔尔(قطر‎ 函数用于这类转变。
只是若是你学过 C,你就能够知晓,大家只供给将罗马尼亚语字符型数据强迫转变来合适的数值型数据,就能够赢得相应的 ASCII 码;反之,假设将一个分外的数值型数据强逼转变到字符型数据,就能够收获相应的字符。
C# 中字符的节制扩充了,不止带有了单字节字符,也能够分包双字节字符,如中文字符等。而在字符和编码之间的调换,则仍延用了 C 语言的做法——强制转变。无妨看看上边的例子

private void TestChar() {
    char ch = 'a'; short ii = 65;
    this.textBox1.Text = "";
    this.textBox1.AppendText("The ASCII code of '" + ch + "' is: " + (short) ch + "n");
    this.textBox1.AppendText("ASCII is " + ii.ToString() + ", the char is: " + (char) ii + "n");
    char cn = '中'; short uc = 22478;
    this.textBox1.AppendText("The Unicode of '" + cn + "' is: " + (short) cn + "n");
    this.textBox1.AppendText("Unicode is " + uc.ToString() + ", the char is: " + (char) uc + "n");
}  它的周转结果是

The ASCII code of 'a' is: 97
ASCII is 65, the char is: A
The Unicode of '中' is: 20013
Unicode is 22478, the char is: 城

  从这些例子中,我们便能特别精通的摸底——通过强迫转变,可以能够字符的编码,只怕得到编码表示的字符。就算你需求的不是 short 型的编码,请参照他事他说加以考察第 1 条实行调换,就可以得到 int 等门类的编码值。

  1. 数值字符串和数值之间的退换

  首先,大家得搞驾驭,什么是数值字符串。大家清楚,在 C# 中,字符串是用朝气蓬勃对双引号包涵的几何字符来代表的,如 "123"。而 "123" 又相对非常,因为组成该字符串的字符皆以数字,那样的字符串,就是数值字符串。在我们的眼中,那就是风华正茂串字符,也是三个数,但Computer却只感到它是三个字符串,不是数。因而,大家在一些时候,比方输入数值的时候,把字符串转变来数值;而在另一些时候,大家须要相反的转移。
  将数值调换到字符串非常轻松,因为每一种类都有多少个 void ToString(卡塔尔(قطر‎方法。全体数值型的 void ToString(卡塔尔(قطر‎ 方法都能将数据转变为数值字符串。如 123.ToSting(卡塔尔国 就将得到字符串 "123"。
那么反过来,将数值型字符串转变来数值又该怎么做吧?大家稳重寻觅一下,会开掘short, int, float 等数值类型均有三个 static Parse(卡塔尔函数。这一个函数正是用来将字符串转变为相应数值的。大家以三个 float 类型的转变为例: float f = float.Parse("543.21"卡塔尔国; 其结果 f 的值为 543.21F。当然,别的的数值类型也能够接收相仿的办法实行转变,上面包车型地铁例子能够更了解的辨证更动的点子:

private void TestStringValue() {
    float f = 54.321F;
    string str = "123";
    this.textBox1.Text = "";
    this.textBox1.AppendText("f = " + f.ToString() + "n");
    if (int.Parse(str) == 123) {
        this.textBox1.AppendText("str convert to int successfully.");
    } else {
        this.textBox1.AppendText("str convert to int failed.");
    }
}  运维结果:

f = 54.321
str convert to int successfully.

  1. 字符串和字符数组之间的改变

  字符串类 System.String 提供了二个 void ToCharArray(卡塔尔(قطر‎方法,该格局能够兑现字符串到字符数组的改造。如下例:

private void TestStringChars() {
    string str = "mytest";
    char[] chars = str.ToCharArray();
    this.textBox1.Text = "";
    this.textBox1.AppendText("Length of "mytest" is " + str.Length + "n");
    this.textBox1.AppendText("Length of char array is " + chars.Length + "n");
    this.textBox1.AppendText("char[2] = " + chars[2] + "n");
}  例中以对转移转变成的字符数首席营业官度和它的一个因素进行了测量试验,结果如下:

Length of "mytest" is 6
Length of char array is 6
char[2] = t

  能够见见,结果完全准确,那表明退换来功。那么反过来,要把字符数组转换来字符串又该怎么呢?
  我们能够动用 System.String 类的布局函数来消除这些标题。System.String 类有八个布局函数是通过字符数组来协会的,即 String(char[]) 和 String[char[], int, intState of Qatar。后面一个之所以多五个参数,是因为能够钦命用字符数组中的哪风流洒脱部分来构造字符串。而前面三个则是用字符数组的漫天要一向组织字符串。我们早先边三个为例,在 TestStringChars(卡塔尔国 函数中输入如下语句:

char[] tcs = {'t', 'e', 's', 't', ' ', 'm', 'e'};
string tstr = new String(tcs);
this.textBox1.AppendText("tstr = "" + tstr + ""n");

  运转结果输入 tstr = "test me",测量检验申明退换到功。
  实际上,大家在众多时候须求把字符串调换到字符数组只是为着博取该字符串中的某些字符。借使只是为了那个指标,那无需大动干戈的去进行改动,大家只需求利用 System.String 的 [] 运算符就足以达到指标。请看下例,再在 TestStringChars(卡塔尔 函数中插足如如下语名:

char ch = tstr[3];
this.textBox1.AppendText(""" + tstr + ""[3] = " + ch.ToString());

  精确的出口是 "test me"[3] = t,经测验,输出准确。

  1. 字符串和字节数组之间的更改

  借使还想从 System.String 类中找到方法实行字符串和字节数组之间的转变,或许你会大失所望了。为了举办这样的转移,大家只可以依附另叁个类:System.Text.Encoding。该类提供了 bye[] GetBytes(stringState of Qatar 方法将字符串转变来字节数组,还提供了 string GetString(byte[]卡塔尔 方法将字节数组转变来字符串。
  System.Text.Encoding 形犹如从未可用的布局函数,但大家得以找到多少个默许的 Encoding,即 Encoding.Default(获取系统的如今 ANSI 代码页的编码卡塔尔、Encoding.ASCII(获取 7 位 ASCII 字符集的编码卡塔尔、Encoding.Unicode(获取使用 Little-Endian 字节顺序的 Unicode 格式的编码State of Qatar、Encoding.UTF7(获取 UTF-7 格式的编码State of Qatar、Encoding.UTF8(获取 UTF-8 格式的编码卡塔尔 等。这里关键说说 Encoding.Default 和 Encoding.Unicode 用于转移的界别。
  在字符串转变成字节数组的历程中,Encoding.Default 会将各类单字节字符,如半角俄文,转变来 1 个字节,而把每种双字节字符,如汉字,转形成 2 个字节。而 Encoding.Unicode 则会将它们都转变到三个字节。大家得以经过下列不难的摸底一下转变的秘技,以致采纳Encoding.Default 和 Encodeing.Unicode 的界别:

private void TestStringBytes() {
    string s = "C#语言";
    byte[] b1 = System.Text.Encoding.Default.GetBytes(s);
    byte[] b2 = System.Text.Encoding.Unicode.GetBytes(s);
    string t1 = "", t2 = "";
    foreach (byte b in b1) {
        t1 += b.ToString("") + " ";
    }
    foreach (byte b in b2) {
        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
67 35 211 239 209 212
b2.Length = 8
67 0 35 0 237 139 0 138

  将字节数组转换到字符串,使用 Encoding 类的 string GetString(byte[]) 或 string GetString(byte[], int, int)方法,具体应用何种 Encoding 仍旧由编码决定。在 TestStringBytes()函数中增添如下语句作为实例:

byte[] bs = {97, 98, 99, 100, 101, 102};
string ss = System.Text.Encoding.ASCII.GetString(bs);
this.textBox1.AppendText("The string is: " + ss + "n");

  运营结果为:The string is: abcdef

  1. 各类数值类型和字节数组之间的转移

  在第 1 条中大家能够查到各个数值型要求利用多少字节的半空中来保存数据。将某种数值类型的数额调换来字节数组的时候,获得的终将是对应大小的字节数组;同样,须求把字节数组转变到数值类型,也亟需以此字节数组大于相应数值类型的字节数。
  未来牵线此类转变的栋梁:System.BitConverter。该类提供了 byte[] GetBytes(...卡塔尔(قطر‎ 方法将各个数值类型转形成字节数组,也提供了 ToInt32、ToInt16、ToInt64、ToUInt32、ToSignle、ToBoolean 等格局将字节数组调换来相应的数值类型。

  由于那类调换日常只是在急需实行较微微的编码/解码操作时才会用到,所以这里就不详细描述了,仅把 System.BitConverter 类介绍给大家。

  1. 转变来十八进制

  任何数据在微管理机内部都以以二进制保存的,所以进制与数码的仓库储存非亲非故,只与输入输出有关。所以,对于进制调换,我们只关心字符串中的结果。
  在地点的第 4 条中涉嫌了 ToString(卡塔尔(قطر‎方法能够将数值转变到字符串,可是在字符串中,结果是以十进制彰显的。将来我们带来它加一些参数,就足以将其转变到十三进制——使用 ToString(string卡塔尔国 方法。
  这里需求一个 string 类型的参数,那就是格式表明符。十二进制的格式表明符是 "x" 可能"X",使用那三种格式表明符的界别首要在于 A-F 三个数字:"x" 代表 a-f 使用小写字母表示,而 "X" 而代表 A-F 使用大字字母表示。如下例:

private void TestHex() {
    int a = 188;
    this.textBox1.Text = "";
    this.textBox1.AppendText("a(10) = " + a.ToString() + "n");
    this.textBox1.AppendText("a(16) = " + a.ToString("x") + "n");
    this.textBox1.AppendText("a(16) = " + a.ToString("X") + "n");
}  运转结果如下:

a(10) = 188
a(16) = bc
a(16) = BC

  当时,我们或然有另后生可畏种需要,即为了显得结果的利落,我们必要调整十九进制表示的长度,借使长度远远不足,用带领的 0 抵补。消除这一个标题,大家只供给在格式表达符“x”或许“X”后写上象征长度的数字就能够了。比方,要限量在 4 个字符的尺寸,能够写成“X4”。在上例中加进一句:

this.textBox1.AppendText("a(16) = " + a.ToString("X4") + "n");

  其结果将出口 a(16State of Qatar = 00BC。
  今后,大家还要说一说怎样将贰个象征十八进制数的字符串转换到整型。那风流洒脱转变,相像要求依赖Parse(卡塔尔国 方法。这里,笔者急需 Parse(string, System.Globalization.NumberStyles卡塔尔(قطر‎方法。第五个参数是意味十五进制数的字符串,如“AB”、“20”(表示十进制的 32)等。第一个参数 System.Globalization.NumberStyles 是三个枚举类型,用来表示十三进制的枚举值是 HexNumber。因而,要是我们要将“AB”转变到整型,就应该如此写:int b = int.Parse("AB", System.Globalization.NumberStyles.HexNumber卡塔尔,最终获得的 b 的值是 171。

  1. 日期型数据和长整型数据里面的转移

  为何要将日期型数据转换为长整型数据吧?原因超多,但就小编个人来讲,平时将它用于数据库的日子存款和储蓄。由于各个数据库对日期型的概念和拍卖是分歧的,各样语言对日期型数据的概念的管理也各不相近,因为,小编宁愿将日期型数据转换到长整型再保存到数据库中。纵然也足以行使字符串来保存,但选用字符串也会涉嫌到大多标题,如区域等难题,并且,它供给比保存长整型数据更加多的半空中。
  日期型数据,在 C# 中的参预运算的时候,应该也是更动为长整型数据来运算的。它的长整型值是自 0001 年 1 月 1 日晚上 12:00 以来所通过时间以 100 毫纳秒为里程一览表示时的数字。这些数在 C# 的 DateTime 中被称作 Ticks(刻度卡塔尔国。DateTime 类型有三个名称叫 Ticks 的长整型只读属性,就封存着那些值。如此,要从三个 DataTime 型数据获得long 型值就极度轻便了,只必要读出 Data提姆e 对象的 Ticks 值就能够,如:

long longDate = DateTime.Now.Ticks;

  DateTime 的布局函数中也提供了对应的,从长整型数据布局 DateTime 型数据的函数:DateTime(long卡塔尔。如:

DateTime theDate = new DateTime(longDate);

  但这么对于许多 VB6 程序猿来讲,是给他们出了风华正茂道难点,因为 VB6 中的日期型数据里面是以 Double 型表示的,将其改动为长整型后获取的但是是日期,而从有的时候间。怎么着和谐那三种日期类型呢?
System.Date提姆e 提供了 double ToOADate(卡塔尔 和 static DateTime FromOADate(doubleState of Qatar 八个函数来减轻这一个难点。后边三个将近期目的按原本的 double 值输出,后面一个则从一个 double 值得到一个 System.DateTime 对象。比方如下:

private void TestDateTimeLong() {
    double doubleDate = DateTime.Now.ToOADate();
    DateTime theDate = DateTime.FromOADate(doubleDate);
    this.textBox1.Text = "";
    this.textBox1.AppendText("Double value of now: " + doubleDate.ToString() + "n");
    this.textBox1.AppendText("DateTime from double value: " + theDate.ToString() + "n");
}  运转结果:

Double value of now: 37494.661541713
DateTime from double value: 2002-8-26 15:52:37

  1. 格式化日期型数据

  编制程序的进度中,平日须求将日期型数据遵照一定的格式输出,当然,输出结果分明是字符串。为此,大家供给利用 System.DateTime 类的 ToString(卡塔尔国 方法,并为其内定格式字符串。
  MSDN 中,System.Globalization.DateTimeFormatInfo 类的概述里对格局字符串有卓殊详尽的验证,因而,这里自身只对常用的局地格式进行认证,首先请看下表:

d
 月底的某一天
 一位数的日期还没前导零
 
dd
 月底的某一天
 一位数的日子有三个前导零
 
ddd
 周中某天的缩写名称
 在 AbbreviatedDayNames 中定义
 
dddd
 周中某天的完好名称
 在 DayNames 中定义
 
M
 月份数字
 一人数的月度未有前导零
 
MM
 月份数字
 一个人数的月度有一个前导零
 
MMM
 月份的缩写名称
 在 AbbreviatedMonthNames 中定义
 
MMMM
 月份的完整名称
 在 MonthNames 中定义
 
y
 不分包纪元的年度
 假诺不含有纪元的年份小于 10,则体现不富有前导零的年度
 
yy
 不带有纪元的年份
 倘诺不包蕴纪元的年度小于 10,则彰显全数前导零的年份
 
yyyy
 饱含纪元的四位数的年份
 
 
h
 12 时辰制的钟点
 一人数的小时数未有前导零
 
hh
 12 小时制的钟点
 壹个人数的小时数有前导零
 
H
 24 时辰制的钟点
 壹人数的小时数未有前导零
 
HH
 24 小时制的钟点
 壹人数的小时数有前导零
 
m
 分钟
 一人数的分钟数未有前导零
 
mm
 分钟
 壹人数的分钟数有八个前导零
 
s
 秒
 一人数的秒数未有前导零
 
ss
 秒
 一人数的秒数有一个前导零  

  为了便利大家的掌握,不要紧试试上边包车型地铁次第:

private void TestDateTimeToString() {
    DateTime now = DateTime.Now;
    string format;
    this.textBox1.Text = "";
    format = "yyyy-MM-dd HH:mm:ss";
    this.textBox1.AppendText(format + ": " + now.ToString(format) + "n");
    format = "yy年M日d日";
    this.textBox1.AppendText(format + ": " + now.ToString(format) + "n");
}  这段程序将出口结果:

yyyy-MM-dd HH:mm:ss: 2002-08-26 17:03:04
yy年M日d日: 02年8日26日

  这个时候,又出新一个标题,倘若要出口的文件新闻中包罗格式字符如何做?如

format = "year: yyyy, month: MM, day: dd";
this.textBox1.AppendText(now.ToString(format) + "n");

  将输出:

2ear: 2002, 4on下5: 08, 26a2: 26

  那实际不是本身想要的结果,如何是好呢?有艺术——

format = ""year": yyyy, 'month': MM, 'day': dd";
this.textBox1.AppendText(now.ToString(format) + "n");

  看,本次运行结果对了:

year: 2002, month: 08, day: 26

  能够看看,只供给使用单引号只怕双引号将文件消息括起来就好。
  如果文本音信中包涵双引号或许单引号又如何做吧?这一个难题,请读者们动出主意吧!

本文由全球彩票历史版本发布于新闻动态,转载请注明出处:中的类型转换

关键词:

上一篇:NET无限级分类的非递归实现
下一篇:没有了