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;
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();
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,经测试,输出正确。