求救,分不够再加,一个一直没搞清楚的问题!
值类型存放在堆栈中,引用类型存放在堆中.
看下面这段代码:
public class A
{
//...
}
public class B
{
int i;
char[] chars = new char[10];
string str = "fdjaskfj";
A ClassA = new A();
B(){}
public I
{
get
{
return i;
}
set
{
i = value;
}
}
public void MyToString()
{
//...
}
}
类A的的引用是在堆栈中的,类A的数据在哪儿呢?
比如类B,B中的字段a,chars,str,ClassA ,他们存放在内存中的什么位置呢?
而B中的方法MyToString(),属性I,在内存中有是怎么存放的呢?
类B是引用类型,他应存放在堆中,也就是说里面的字段也是在堆中,
C#中的所有代码都是在类中,也就是说都是在堆中存放,那堆栈呢???
迷惑,求解~~~谢谢,望详细回答,分不够再加~
还有一个简单的问题,在继承中,重写方法和隐藏方法的区别,他们都可以用Base关键字来访问基类,那到底有什么区别呢?
2个问题,求解~~~~~~~~谢谢!!!
问题点数:0、回复次数:11Top
1 楼adamxx(adaxin是无敌小新?)回复于 2004-08-03 06:09:48 得分 0
怎么没人回贴啊,我自己顶!Top
2 楼daou101(海天一鸥)回复于 2004-08-03 08:04:06 得分 0
请注意,类总是在堆上创建的,当出现函数调用,赋值时候,.NET总是传值,所不同的是,传递的是引用的值,结构也是传值,确是传递结构本身。但结构成员仍然遵循按值传递原则。请勿误解传引用和传值。
凡是涉及类之间操纵的,包括赋值,函数调用等等一切行为,地址定位都是通过堆栈运算操纵的,但记住,堆栈中并不保存类的任何信息。一个类一旦创建,那么他在堆内存上就是只读的,不许在应用程序生存期中被破坏,除非你显示调用Fianlize()方法或者CLR破坏它。
记住一点,非原始值类型,都是存放在堆中,所以,当你用一个类包装一个int类型的数据时,这个int数据就代表着堆上的一个32位内存空间。与堆栈半点关系也没有。
重写是多态的概念,它复写了基类方法,是晚绑定的。隐藏方法是使用new关键字创建了一个新的方法,C#对非虚方法使用早绑定,所以隐藏了基类方法--这就是“隐藏”的本质。
Top
3 楼liujiayu10(活着就好)回复于 2004-08-03 08:32:20 得分 0
是属性没搞清Top
4 楼jia4950()回复于 2004-08-03 08:35:24 得分 0
学习Top
5 楼ncucf(ncu晨风)回复于 2004-08-03 08:41:20 得分 0
关于堆栈和堆的问题,好像c#的托管机制,并不要求程序员知道内存是如何分配的除非你用到不安全代码,才有必要知道它们是如何排布的——那个时候,可以用tructLayoutAttribute类来要求那些是如何排布的!
关于重写和隐藏:
override的要求比较严格,不但要是virtual类型,参数格式要一致,访问权限,也要一样!
而new就比较随便了——当然,有时候,多加、少加一个new,它会警告你!
我觉得,new关键字,是给程序员自己看的,没有其他意义,只是说明,基类有过这个东西而已!
和全局变量被局部屏蔽一样,只不过是基类函数,被派生类函数屏蔽了而已!
当然,还可以用base.*的方法,去访问基类函数的!
new关键字,是给程序员自己看的,没有其他意义,只是说明,基类有过这个东西而已!
和全局变量被局部屏蔽一样,只不过是基类函数,被派生类函数屏蔽了而已!
当然,还可以用base.*的方法,去访问基类函数的!
new的作用,只是给程序员一点提醒而已,好像既不会起到动态联编的作用,又不会起到完全屏蔽基类的作用!
所以它多加一个,少加一个,都一样可以通过编译——比如你基类,没有子类同样的函数,你一样可以加个new字的,而如果你基类有和子类同样的函数,你也同样可以不加new字的!
而重写,主要是为多态的要求而制定的,系统开销会高一些!Top
6 楼zjpixyniannian()回复于 2004-08-03 08:50:04 得分 0
markTop
7 楼daou101(海天一鸥)回复于 2004-08-03 09:00:02 得分 0
属性在dotNET内部是以“成员方法”的形式实现的,它本身就是一种方法,只不过CLR为它提供固有支持,是给你的一种“语法甜头”,没什么大用!Top
8 楼adamxx(adaxin是无敌小新?)回复于 2004-08-03 16:06:25 得分 0
To daou101(海天一鸥) :
也就是说在堆栈中存放的都是类的引用,能不能举个例子说明一下,我还是不大明白!
To ncucf(ncu晨风)
也就是说覆盖和隐藏都差不多,而声明了虚函数还要增加系统开销,那为什么还要用virtual和override~~不如new方便,他们的功能都是一样的!Top
9 楼ncucf(ncu晨风)回复于 2004-08-04 15:18:38 得分 0
我说了是为了动态联编的作用啊!
比如一个父类的类型参数,如果是用new的方法,那不管传什么引用给它,只会是派生类的方法被执行。
而用了虚函数,也就是可以override的,你给他一个派生类对象的引用,它就执行派生类的方法,给了一个基类对象的引用,它就执行基类的方法,这就可以起到一个运行过程中,自动识别的功能啊!Top
10 楼daou101(海天一鸥)回复于 2004-08-04 15:53:39 得分 0
非常简单的例子:
Main()
{
int a=11;
//a存储在堆栈中,它是零时变量
foo(a);//传递a的一份拷贝,也就是在函数调用堆栈上申请了的一个32位内存区,值是11
//a被释放了
//函数调用结束了,堆栈中的a的副本自动消失了,因为出栈了
如果是对象,那么传递的就是引用。道理一样。
}
void foo(int a)
{
a++;
Console.WriteLine(a);
}
Top
11 楼adamxx(adaxin是无敌小新?)回复于 2004-08-05 10:20:02 得分 0
to daou101(海天一鸥):
方法中的变量存放在堆栈中,那他怎样和堆中的数据联系?Top




