object i=99;
Console.WriteLine(i.GetType());//结果是System.Int32
i=23.55;//既然 i 是System.Int32还可以将Double类型赋值进去?
Console.WriteLine(i.GetType());//结果是System.Double
那么i到底是什么类型,是存储在堆中还是栈中?
Console.WriteLine(i.GetType());//结果是System.Int32
i=23.55;//既然 i 是System.Int32还可以将Double类型赋值进去?
Console.WriteLine(i.GetType());//结果是System.Double
那么i到底是什么类型,是存储在堆中还是栈中?
你把i赋值一个小数,当object对象封装i时 实际上时封装的是那个小数 所以类型会变成Double
再执行i=23.55; 发生的事情是 在堆中另外分配一块空间存放23.55,i指向这块空间 所以i GetType是double楼主在装箱拆箱这块要加强
首先分配个地址存99
输出99
改变该地址的值,内存段仍是同一个地方,只是值变化了
关键是第一句话
object j = i;
i = 2;
Console.WriteLine(Object.ReferenceEquals(i,j));//返回false
我觉得 i.GetType()得到的是i所指向的数据的数据类型而不是i本身的类型,所以i应该是存放在堆中,第二次给i赋值同样的值,但是在堆中另外分配一块空间存放2,所以Object.ReferenceEquals(i,j))返回false
不知道我的理解对不对?
谢谢大家的帮助,希望大家继续提出自己的见解。
class Program
{
static void Main(string[] args)
{
Person p=new Student();
Console.WriteLine(p.ToString());//此处返回的是Student类型
//那么p到底是什么类型呢?如果是Student类型为什么不能直接调用Print()方法?而是得有一个显式的类型转换才能调用:((Student)p).Print();
}
} class Person
{
} class Student : Person
{
public void Print()
{ }
} 希望大家集思广益!再次感谢大家
1.p是Student类型
2.程序运行起来之后才知道p是Student类型(当然也是Person),在还没运行之前,编译器只能确定p是Person 类型,所以不允许p.Print()通过编译
class Person
{
public virtual void Print()
{
}
}class Student : Person
{
public override void Print()
{
}
}这样就可以调用Print 而且根据你new的时候,如果你Person p = new Person() 调用的是 Person的Print方法
如果你Person p = new Student() 调用的是Student 的Print方法这是面向对象的多态
你把i赋值一个小数,当object对象封装i时 实际上时封装的是那个小数 所以类型会变成Double