第一次发贴,练习一下。活越一下气氛,问个编程的基本问题,答对给分问题:当子类实例对象装入父类实例对象时,是传值还是传地址,请说明理由?

解决方案 »

  1.   

    To: www_123du_com(鼠·神·泪) 
    是"父类实例对象"以后再解释为何这样说To:hdt(倦怠) 
    To:www_123du_com(鼠·神·泪)请再次考虑答案(^_^)
      

  2.   

    Item 6:   Distinguish Between Value Types and Reference Types
    《Effective C#》Item 6:区分值类型和引用类型
    http://blog.csdn.net/knight94/archive/2006/07/01/861383.aspx
      

  3.   

    只要是实例化对象,通通是传址的。虽然这个地址不等价于内存地址,而是通过更为复杂的机制。例如:对象A,此时你应该知道A仅仅是一个地址。myDataType A=new myDataType();
    myDataType B=A;有人可能认为A是对象实例,而B是引用。其实A、B全都是同一个对象实例的引用。
      

  4.   

    To:说是传址的
    看一下:    class Program
        {
            static void Main(string[] args)
            {
                父 obj_父 = new 父();
                子 obj_子 = new 子();            obj_父 = obj_子; //<--是传址吗            obj_子 = null;   //<--这里释放了什么            obj_父.hello();  //<--如果是传址,这句为何可执行,不报错
                
               
                Console.Read(); //停屏用
              }
        }
    class 父
    {
       
        public void hello()
        {
            Console.WriteLine("我来自父"); 
        }
    }class 子:父
    {
       
    }
      

  5.   

    obj_父 = obj_子; //<--是传址吗            obj_子 = null;   //<--这里释放了什么 //这不是释放,而是对obj_子重新赋值为NULL            obj_父.hello();  //<--如果是传址,这句为何可执行,不报错
                
      

  6.   

    obj_子 = null;   //<--这里释放了什么
      

  7.   

    obj_子 = null;   //<--这里释放了什么
    ======================
    这里什么也没释放,"obj_子"原来指向的对象还在内存中。
      

  8.   

    因此,B=A 并不是把A的地址传给B,而是把A的内容传给B。
      

  9.   

    因此,B=A 并不是把A的地址传给B,而是把A的内容传给B。内容?,你是说传值
      

  10.   

    可以进http://www.9i5e.com/Company.aspx 看看,个人觉的不错的例子
      

  11.   

    通俗的说
    obj = NULL ;只是把obj这个变量指向了NULL
    .NET 有gc,如果没有后面的obj_父.method(),在某一时刻.net垃圾收集会自动把obj_子原来指向的对象收集掉,
      

  12.   

    “obj_父、obj_子”本身就是“指针”,并不是指针所指向的对象实例。
      

  13.   


    又To:所有传值
    又To:所有传值
    又To:所有传值
    又To:所有传值    class Program
        {
            static void Main(string[] args)
            {
                父 obj_父 = new 父();
                子 obj_子 = new 子();            obj_父.值 = "父值";
                obj_子.值 = "子值";            obj_父 = obj_子; //<--是传值吗            obj_子.值 = "(^_^)"; //<--如果是传值,那对[obj_父]应没有影响
                Console.WriteLine(obj_父.值); //<--为何是会显示"(^_^)"
                
                Console.Read(); //停屏用
            
            }
        }
    class 父
    {
        public string 值;
       
    }class 子:父
    {}
      

  14.   

    obj_父 = obj_子; 的行为是将[obj_父]的指针定位到[obj_子]的数据堆还是用[obj_子]的数据堆覆盖了[obj_父]的数据堆请结合
    To:说是传址的
    又To:所有传值
    代码说明
      

  15.   

    建議你去把C#再好好看看吧,B=A 並不是把說B的地址被A替換了,因為A是B的子類,所以就是說,訪問時,若A和B中有相同的函數和變量,先訪問A中的,沒有再訪問B中的。
      

  16.   

    To:hdt(倦怠) 
    请将原代码加GC,静态构造函数,构造函数,析构函数再试一下
    (^_^)
      

  17.   

    To: tjvictor(初学者) 
    关于“子类装入父类"时的,
    方法重写,重载,虑拟,
    事件的重写,
    属性的重写,重载,虑拟
    变量的重写
    一会再谈(^_^)
      

  18.   

    To: tjvictor(初学者) 
    还有关于“子类装入父类"时的,委托的重写,委托协变与逆变
      

  19.   

    To:huangjinyin(Mylove) 地址指到那里去?上例中
    堆上的数据都没了
      

  20.   

    只要是实例化对象,通通是传址的。虽然这个地址不等价于内存地址,而是通过更为复杂的机制。例如:对象A,此时你应该知道A仅仅是一个地址。myDataType A=new myDataType();
    myDataType B=A;有人可能认为A是对象实例,而B是引用。其实A、B全都是同一个对象实例的引用。
    ----------------------------------------------------------------------
    定义一个class A,然后class B:A
         A a=new A();
         B b=a;
    等于是把a的引用传给b,使A,B两给类的两给对象同时指向一个地址
      

  21.   

    To:polojojo(JOJO) "更为复杂的机制",有点意思了A、B全都是同一个对象实例的引用我上例中[To:说是传址的]中
    [obj_父.hello()]时,[obj_父]引用了那个堆
      

  22.   

    显然是地址C#其实变量名就相当于指针,只是C#的指针使用判别比C++严谨很多
      

  23.   

    To:futouwei(斧头) 5年前我在C++里就认为是"显然"
      

  24.   

    obj_父 = obj_子; 的行为是将[obj_父]的指针定位到[obj_子]的数据堆还是用[obj_子]的数据堆覆盖了[obj_父]的数据堆
    ————————————————————————————————————————
    是用[obj_子]的指针的值覆盖了[obj_父]的指针的值。
      

  25.   

    再To:futouwei(斧头) //C#的指针使用判别比C++严谨很多"严谨",那系统在判别时所使用的"严谨"规是什么,(^_^)
      

  26.   

    wxwinter() ( ) 信誉:100    Blog  2006-08-25 15:59:00  得分: 0  
     
     
    因此,B=A 并不是把A的地址传给B,而是把A的内容传给B。内容?,你是说传值
    _____________________________可以这么说,是A变量把其栈上内容传给了B变量。而此内容本身就是引用(地址)。所以,说传值也行,传地址也行吧。因为值就是地址。而值类型不同之处就在于栈上的内容就是本身,而不是地址,所以就可以没有争议的说:传值。
      

  27.   

    “的指针”也有歧义:“[obj_父]”、“[obj_子]”本身就是指针,不是堆。
      

  28.   

    To: sp1234(如果只为活着,还不如不活)//是用[obj_子]的指针的值覆盖了[obj_父]的指针的值。[obj_父]的指针的值,指向何处了?
      

  29.   

    To:sp1234(如果只为活着,还不如不活) 所以我说还不如用指针桟和数据堆来描述指针桟:变量名
    指针桟的值:数据堆地址
    数据堆:对象实例的二进制执行代码
    传址:改变指针桟的值
    传值:改变数据堆值(这句有点问题,不过都能理解)
      

  30.   

    //////!!!!!!////            obj_父 = obj_子; //<--是传址吗            obj_子 = null;   //<--这里释放了什么            obj_父.hello();  //<--如果是传址,这句为何可执行,不报错堆地址传了obj_父 = obj_子;
    堆被我毁了obj_子 = null; 
    代码执行了obj_父.hello();  我的神啊,不要说该行obj_子 = null; 毁的是内存中的指针.数据堆还在
      

  31.   

    lz真的很搞赋值为null就是释放内存。汗~~~~~~~~~~~
            object A = new object();
            object B = new object();
            B = 1;
            A = 2;
            object C = B;// B = 1, C = 1。但是,由于前面的装箱操作,B和C实际上指向同一块“内存”
            B = A;//现在B指向A指向的“内存”了
            A = null;//A不指向任何“内存”了
            Console.WriteLine("A : {0}", A);//
            Console.WriteLine("B : {0}", B);//2
            Console.WriteLine("C : {0}", C);//1
    以上整个过程中,没有手工释放任何内存。
      

  32.   

    堆地址传了obj_父 = obj_子;
    堆被我毁了obj_子 = null; //谁告诉你毁了堆了?
    代码执行了obj_父.hello();  我的神啊,不要说该行obj_子 = null; 毁的是内存中的指针.数据堆还在
    ==========
    什么都没有被摧毁,这个问题不应该问神,应该问csc.exe
      

  33.   

    To:mobydick(敌伯威|我排著队拿著爱的号码牌) 窗体对象=null;
    请问
    窗体对象.Show();//还可以吗?
      

  34.   

    wxwinter() ( ) 信誉:100    Blog  2006-08-25 17:02:00  得分: 0  
     
     
       To:mobydick(敌伯威|我排著队拿著爱的号码牌) 窗体对象=null;
    请问
    窗体对象.Show();//还可以吗?
      
     
    ========================
    问的好
    如果
    窗体对象2 = 窗体对象;
    窗体对象 = null;
    窗体对象2.Show()//可以的。窗体对象 = null;是指,“窗体对象”现在不指向任何内存了,但是,他原来指向过的内存还在,只是无法访问到了。
      

  35.   

    引用类型总是在堆中分配(除非使用 stackalloc 关键字),并给予一个额外的间接层;也即,它们需要通过对其存储位置的引用来访问。既然这些类型不能直接访问, 某个引用类型的变量总是保存实际对象的引用(或 null ) 而不是对象本身。
    ==================
    看了这句话如果还不明白这个问题,那就没必要讨论了。
      

  36.   

    sp1234(如果只为活着,还不如不活) ( ) 信誉:100   Blog  2006-08-25 16:44:00  得分: 0  
     
    所以,说传值也行,传地址也行吧。因为值就是地址。
    ————————————————————————————————————
    对的。对对象的传值就是对对象的数据堆的传址。与值类型不同。楼上最后说的完全对。
    _________________________________________________________________________多谢你的肯定!
      

  37.   

    类都是传地址的,建议去看愚翁的BLOG
      

  38.   

    (^_^)谢谢,谢谢,学习了,请教了
    不发八卦贴,只能是技术贴,到下班有30个回,我就赢一顿饭谁说周末程序员都Happly去了
    //////////////////////////
     mobydick(敌伯威|我排著队拿著爱的号码牌) ( ) 信誉:100    Blog  2006-08-25 17:05:00  得分: 0 
    谢谢,谢谢,谢谢以后的贴,从那贴开始他们把我机器拔了谢谢大家。晚些结!
    ------------------------------------------------