.为什么number.ToString()不属于装箱和数制中 权位 意思

数制中 权位 意思:

 

权:在数学/数据结构等学科中都有相关联定义:指定系列位置上的数据所代表数值大小;

比如:在十进制实数中,个位上的数字1表示的权值就是1;而百位上的1权值是100;当然在百分位的1就是0.01了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

i.ToString()。编译器发现 i 重写了ToString方法,会直接调用ToString的指令。
i 是值类型,编译器不会出现多态行为。
因此,直接调用,不装箱。
ToString是 i 的基类System.ValueType的方法

 

值类型自己的ToString()方法,因为其类型是值类型,所以不装箱


举个例子。
Struct A : ICloneable
{
public Int32 x;
public override String ToString() {
return String.Format(”{0}”,x);
}
public object Clone() {
return MemberwiseClone();
}
}
static void main()
{
A a;
a.x = 100;
Console.WriteLine(a.ToString());
Console.WriteLine(a.GetType());
A a2 = (A)a.Clone();
ICloneable c = a2;
Ojbect o = c.Clone();
}
0:a.ToString()。编译器发现A重写了ToString方法,会直接调用ToString的指令。因为A是值类型,编译器不会出现多态行为。因此,直接调用,不装箱。(注:ToString是A的基类System.ValueType的方法)
1:a.GetType(),GetType是继承于System.ValueType的方法,要调用它,需要一个方法表指针,于是a将被装箱,从而生成方法表指针,调用基类的System.ValueType。(补一句,所有的值类型都是继承于System.ValueType的)。
2:a.Clone(),因为A实现了Clone方法,所以无需装箱。
3:ICloneable转型:当a2为转为接口类型时,必须装箱,因为接口是一种引用类型。
4:c.Clone()。无需装箱,在托管堆中对上一步已装箱的对象进行调用。
附:其实上面的基于一个根本的原理,因为未装箱的值类型没有方法表指针,所以,不能通过值类型来调用其上继承的虚方法。另外,接口类型是一个引用类型。对此,我的理解,该方法表指针类似C++的虚函数表指针,它是用来实现引用对象的多态机制的重要依据。

 

 

装箱与拆箱操作只会在将一个对象由值类型转换为引用类型或引用到值的转换时发生,int.ToString()仅仅是int的一个方法,将int作为一个字符串表现出来,根本不存在类型的转换,何来装箱与拆箱操作??
    int i = 1; i.ToString()之后产生了一个新的对象"1", 跟原来的i没有任何关系,稍微有点计算机知识的人都知道,1和"1"完全是两回事。象object o = i 和 i = (int)o的操作,操作的对象始终是1,只不过这个1被保存在栈(i)或者堆(o)上,这个时候才会产生装箱和拆箱的操作。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值