作者cole945 (躂躂..)
看板C_Sharp
标题Re: [问题] 资料型态转换的问题
时间Tue May 29 13:00:47 2007
※ 引述《rayhill (....)》之铭言:
: 最近写asp.net时,有一些关於转型的疑问
: 像是Application["myCount"] = Convert.ToInt32(Application["myCount"];
: 这样编译才会过,如果用(int)或int.parse则不行,
: 不知道这几种转型主要的差异点在何处?
: 谢谢各位大大了~
那个 Application[] 的type是object,
所以你的问题跟
object o = 你放进去了某个东西;
再把 o 转成 int 是一样的问题 @.@"
依你放进去的东西型别不同, 要怎麽转int就会有不同的转法..
如果你是放 int(或其他value type的东西)进去,
那就变成 boxing/unboxing的问题
http://msdn2.microsoft.com/en-us/library/yz2be5wk(VS.80).aspx
object o = 123; // boxing
int i = (int)o; // unboxing
123原本的value-type, 被你放进object(refernec-type)所以要会被boxing起来,
当要取回原值时, 再unboxing回value-type,
要注意前後两个type一定要一模一样 (不能进去时是short, 回来时变int)
如果你的 (int) 不是上面的unboxing, 那就变成 type casting..
http://msdn2.microsoft.com/en-us/library/xhbhezf4(VS.80).aspx
如果你放进去的型别没有实作这个 (int) coversion operator,
那就不能用 (int) 来转
若你放进去的东西是 string, 那就不能用这个方法转, 因为string没有实作..
不然可以转成该型别, 再casting成int
int i = (int)( o as 某个型别);
再来就是 Int.Parse和 Convert 的问题..
Int.Parse(或其他xxx.Parse)是用来把 string 转成该型别的,
如果你的放进去的东西是 string, 那用 Int.Parse就可以了
int i = int.Parse( o as string);
也就是你的 int i = int.Parse( Application["myCount"] as string);
或写成 int i = int.Parse( (string)Application["myCount"] );
当然要 int i = int.Parse( Application["myCount"].toString() ); 也可以
你会发生不能转的主要问题应该是 Application[] 的型别是 object,
型是 int.Parse 要的型别是string, 所以你要先转回 string才能使用
要注意最後一种 .toString() 的语意和其他三者不同,
虽然可以达到一样的效果..
如果原本的型别就是 string, 那就可以用 (string) 或 as string转成原本的string
但 toString() 则是呼叫 object 下的 toString()
因为 string class 覆写了object的toStrnig, 所以你呼叫toString()
时会变成呼叫原本 string 的 toString() (也就是传回string的字串值)
而若object是int, 那 totring() 变成呼叫 int的toString..
不管是 string s = "123"; s.toString()为"123"
int i = 123; i.toString() 也是 "123"
所以某方面来说, 用toString()的方法不管在int或string都通用,
(通用, 但也许效率较差?)
而 Convert 的话, 通用来说是转换实作 IConvertible 的型别
class MyType: IConvertible {
public int i = 0;
public int ToInt32(IFormatProvider provider) {
return i;
}
/* 其他略 */
}
像实作 IConvertible 的 ToInt32就可以让你自己的class(即MyType)利用
Convert.ToInt32( new MyType() ) 转成 int
string也有实作 IConvertible界面, 所以string也可以用 Conver.ToInt32
来转成 int
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.139.132.217
※ 编辑: cole945 来自: 220.139.132.217 (05/29 13:01)
1F:推 rayhill:太感谢了^^很详细的解说,大概了解了,看来还是要多看书@@ 05/29 13:09
※ 编辑: cole945 来自: 220.139.132.217 (05/29 15:08)