请高手指点.面向对象,我学得有点晕!

wumylove1234 2004-07-30 12:20:47
using System;

namespace ConsoleApplication1
{
public class ClassA
{
public void Go()
{Console.WriteLine("ClassA");}
}
public class ClassB:ClassA
{
public int t;
new public void Go()
{Console.WriteLine("ClassB");}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
ClassA A=new ClassA();
ClassB B=new ClassB();
B.t=10;
//A=B;
ClassB C=A as ClassB;
if(C == null)
Console.WriteLine("Null");
else
Console.WriteLine("not null");
//ClassB C=(ClassB)A;
//C.Go();

}
}
}

大家不用太看上边的测试代码.
ClassA A=new ClassA();
ClassB B=new ClassB();
B.t=10;
A=B;
ClassB C=(ClassB)A;
Console.WriteLine(C.t);

这时是可以输出C.t的,其值和B.t是相同的,这是为什么呢?按我的理解,A=B的时候,是将B的一部分可以转为的成员的复制到A的内存空间中,那也就是说A不在有t这个成员,那到再显示转到C上时,C.t应该是0,可结果确是还是C.t!请高手讲解原理!

还有:
ClassA A=new ClassA();
ClassB B=new ClassB();
B.t=10;
A=B;
ClassB C=A as ClassB;
Console.WriteLine(C.t); 这样的结果和上边的是一样的,为什么呢?它是怎么记住B这个对象的值的呢?或者说,是用什么怎么样的一个指针指到了B上?
如果注释掉://A=B,之后,C的就为Null了,这又是因为什么没有给C分配空间呢?

请各位高手指点迷津!谢谢.
...全文
97 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumylove1234 2004-07-30
  • 打赏
  • 举报
回复
谢谢楼上的大侠指点.
终于有点明白了!!!!!
winxieddd 2004-07-30
  • 打赏
  • 举报
回复
1.你可能把C#和C++搞混了。C#中类用的都是引用,而不会按值在内存里复制。其实,A=B时,那个t仍在,只是你有A不能调用。只是A在内存中的指针指向了B里面A类的那部分。然后,你又把A转换回来了,当然这里C和B其实指向的是同一个对象,因此,你得到的结果当然是C.t.

2.其实,你把A=B注释掉后,那A在内存中的指针就指向了他新申请的那块内存,系统向动为对象初试化,所以,他现在是0。其实,你只要用到new系统就分配内存了,也就是说,你的对象名实际就是一个指针,指向内存中一块区域,但你要是用这个指针指向其他对象,那这块内存就会找不到,不过没关系,自有垃圾收集,这也正是垃圾收集的好处呀,不象C++你只要new一块内存,你就得关心在什么时候释放它,要不然就引起内存泄漏。

你要是真想拷贝一块内存,在C#中可以用封箱,拆箱。具体参看
《.net框架程序设计(修订版)》

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧