C#.NET 类型转换

 
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 个字 )
可以用下列代 做一个 实验
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() 函数,我 将看到运行 果如下:
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 量。如下例:
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() 函数中追加如下 句:
int g = 1;
short h = g;
this.textBox1.AppendText("h = " + h.ToString() + "/n");
编译报错
G:/Projects/Visual C#/Convert/Form1.cs(118): 无法将
型“int” 转换为 “short”
其中,Form1.cs 的 118 行即 short h = g 所在行。
候,如果我 们坚 持要 转换 ,就 应该 使用 转换 C 言中常有提及,就是使用 “( 型名 ) 量名 形式的 句来 数据 转换 。如上例修改如下:
short g = 1;
byte h = (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
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 就会溢出。 方面的例子大同小异,就不 详细说 明了。
3. 字符的 ASCII Unicode
很多 候我 需要得到一个英文字符的 ASCII ,或者一个 字字符的 Unicode ,或者从相 编码查询 它是哪一个字符的 编码 。很多人,尤其是从 VB 程序序 转过 来学 C# 的人,会 C# 没有提供 成的函数来做 个事情 —— VB 中有 Asc() 函数和 Chr() 函数用于 这类转换
但是如果你学 C ,你就会清楚,我 只需要将英文字符型数据 转换 成合适的数 型数据,就可以得到相 ASCII ;反之,如果将一个合适的数 型数据 转换 成字符型数据,就可以得到相 的字符。
C#
中字符的范 围扩 大了,不 包含了 字符,也可以包含双字 字符,如中文字符等。而在字符和 编码 转换 仍延用了 C 言的做法 —— 转换 不妨看看下面的例子
private void TestChar()
{
char ch = 'a';
short ii = 65; < BR > 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 型的 编码值
4. 字符串和数 转换
首先,我 得搞明白,什 是数 字符串。我 知道,在 C# 中,字符串是用一 双引号包含的若干字符来表示的,如 "123" 。而 "123" 又相 特殊,因 为组 字符串的字符都是数字, 这样 的字符串,就是数 字符串。在我 的眼中, 即是一串字符,也是一个数,但 算机却只 认为 它是一个字符串,不是数。因此,我 在某些 候,比如 入数 候,把字符串 转换 成数 ;而在另一些 候,我 需要相反的 转换
将数 值转换 成字符串非常 简单 ,因 为每 一个 都有一个 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.
5. 字符串和字符数 转换
字符串 System.String 提供了一个 void ToCharArray() 方法, 方法可以 实现 字符串到字符数 转换 。如下例:
private void TestStringChars()
{
string str = "mytest";
char[] chars = str.ToCharArray();< BR > 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, int) 。后者之所以多两个参数,是因 可以指定用字符数 中的哪一部分来构造字符串。而前者 是用字符数 的全部元素来构造字符串。我 以前者 例,在 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 经测试 出正确。
6. 字符串和字 转换
如果 想从 System.String 中找到方法 行字符串和字 转换 ,恐怕你会失望了。 这样 转换 ,我 不得不借助另一个 System.Text.Encoding 该类 提供了 bye[] GetBytes(string) 方法将字符串 转换 成字 提供了 string GetString(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 的区
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
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 使用大字字母表示。 如下例:
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(16) = 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
9. 日期型数据和 整型数据之 转换
要将日期型数据 转换为长 整型数据呢?原因很多,但就我个人来 常将它用于数据 的日期存 。由于各 数据 库对 日期型的定 理是不一 的,各 种语 日期型数据的定 理也各不相同,因 ,我宁愿将日期型数据 转换 整型再保存到数据 中。 然也可以使用字符串来保存,但使用字符串也会 及到 问题 ,如区域等 问题 ,而且,它需要比保存 整型数据更多的空
日期型数据,在 C# 中的参与运算的 候, 应该 也是 转换为长 整型数据来运算的。它的 整型 是自 0001 1 1 日午夜 12:00 以来所 经过时间 100 毫微秒 为间 隔表示 的数字。 个数在 C# DateTime 中被称 Ticks( 刻度 ) DateTime 型有一个名 Ticks 整型只 属性,就保存着 。如此,要从一个 DataTime 型数据得到 long 就非常 简单 了,只需要 DataTime 象的 Ticks 即可,如:
long longDate = DateTime.Now.Ticks;
DateTime 的构造函数中也提供了相 的,从 整型数据构造 DateTime 型数据的函数:DateTime(long)。如:
DateTime theDate = new DateTime(longDate);
这样对 于很多 VB6 程序 ,是 出了一道 难题 ,因 VB6 中的日期型数据内部是以 Double 型表示的,将其 转换为长 整型后得到的 仅仅 是日期,而没有 时间 。如何 协调这 日期 型呢?
System.DateTime
提供了 double ToOADate() static DateTime FromOADate(double) 两个函数来解决 问题 。前者将当前 象按原来的 double 值输 出,后者 从一个 double 值获 得一个 System.DateTime 象。 例如下:
private void TestDateTimeLong()
{
double doubleDate = DateTime.Now.ToOADate();
DateTime theDate = DateTime.FromOADate(doubleDate); < BR > 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
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
包括 元的四位数的年份
 
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
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值