CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

求救,分不够再加,一个一直没搞清楚的问题!

楼主adamxx(adaxin是无敌小新?)2004-08-03 04:35:15 在 .NET技术 / C# 提问

值类型存放在堆栈中,引用类型存放在堆中.  
  看下面这段代码:  
  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

相关问题

  • 被遗忘的角落——但必须要搞清楚!(可加分)
  • SOCKET问题???出血1000分搞清楚它。
  • 再散分。终于搞清楚了那个可恶的东西是什么了。
  • 一个关于内存分配的问题,比较初级,可是我一直没搞清楚
  • 送100分请大家帮忙搞清楚一个有关数据绑定的问题?
  • 过滤器的类~~还有小小未搞清楚,,~~送20分了,,大家来看看
  • 一直没搞清楚
  • 这一段我翻译的时候有一些问题,自己也没搞清楚原意是什么,请进来看看(分不是问题)
  • 100分,不够加帖!
  • 100分!不够再加

关键词

  • c#
  • 函数
  • 内存
  • 屏蔽
  • 程序员
  • 代码
  • 数据
  • 执行
  • 结构
  • 堆栈

得分解答快速导航

  • 帖主:adamxx

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo