第一次发贴,练习一下。活越一下气氛,问个编程的基本问题,答对给分问题:当子类实例对象装入父类实例对象时,是传值还是传地址,请说明理由?
解决方案 »
- 高手们快来呀,winform如何做像迅雷7那样的换肤效果?
- 为什么智能设备里引用的System.Net里没有WebClient类?
- c#可以写过程桌面程序吗(高分请教)
- 请 教 .net 一 设 置 断 点 调 试 就 死 机 的 问 题
- 各位大侠,帮帮忙,有知道plt文件格式的吗?
- 100分求正则表达式!!!!!!!!!!!!!!
- 我想在C#里面定义打开页面的TARGET格式和地址, 这样可以嘛????????????????????
- 手写识别,合作
- VS2013程序写注册表
- 在DATAGRID导到EXCEL中的时候,数据格式如何保持不变,各位大哥帮忙解答一下,谢谢!
- 求助:DrawLine绘图好像比较慢,有没有别的办法?
- 如何写测试用例??
是"父类实例对象"以后再解释为何这样说To:hdt(倦怠)
To:www_123du_com(鼠·神·泪)请再次考虑答案(^_^)
《Effective C#》Item 6:区分值类型和引用类型
http://blog.csdn.net/knight94/archive/2006/07/01/861383.aspx
myDataType B=A;有人可能认为A是对象实例,而B是引用。其实A、B全都是同一个对象实例的引用。
看一下: 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 子:父
{
}
======================
这里什么也没释放,"obj_子"原来指向的对象还在内存中。
obj = NULL ;只是把obj这个变量指向了NULL
.NET 有gc,如果没有后面的obj_父.method(),在某一时刻.net垃圾收集会自动把obj_子原来指向的对象收集掉,
又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 子:父
{}
To:说是传址的
又To:所有传值
代码说明
请将原代码加GC,静态构造函数,构造函数,析构函数再试一下
(^_^)
关于“子类装入父类"时的,
方法重写,重载,虑拟,
事件的重写,
属性的重写,重载,虑拟
变量的重写
一会再谈(^_^)
还有关于“子类装入父类"时的,委托的重写,委托协变与逆变
堆上的数据都没了
myDataType B=A;有人可能认为A是对象实例,而B是引用。其实A、B全都是同一个对象实例的引用。
----------------------------------------------------------------------
定义一个class A,然后class B:A
A a=new A();
B b=a;
等于是把a的引用传给b,使A,B两给类的两给对象同时指向一个地址
[obj_父.hello()]时,[obj_父]引用了那个堆
————————————————————————————————————————
是用[obj_子]的指针的值覆盖了[obj_父]的指针的值。
因此,B=A 并不是把A的地址传给B,而是把A的内容传给B。内容?,你是说传值
_____________________________可以这么说,是A变量把其栈上内容传给了B变量。而此内容本身就是引用(地址)。所以,说传值也行,传地址也行吧。因为值就是地址。而值类型不同之处就在于栈上的内容就是本身,而不是地址,所以就可以没有争议的说:传值。
指针桟的值:数据堆地址
数据堆:对象实例的二进制执行代码
传址:改变指针桟的值
传值:改变数据堆值(这句有点问题,不过都能理解)
堆被我毁了obj_子 = null;
代码执行了obj_父.hello(); 我的神啊,不要说该行obj_子 = 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
以上整个过程中,没有手工释放任何内存。
堆被我毁了obj_子 = null; //谁告诉你毁了堆了?
代码执行了obj_父.hello(); 我的神啊,不要说该行obj_子 = null; 毁的是内存中的指针.数据堆还在
==========
什么都没有被摧毁,这个问题不应该问神,应该问csc.exe
请问
窗体对象.Show();//还可以吗?
To:mobydick(敌伯威|我排著队拿著爱的号码牌) 窗体对象=null;
请问
窗体对象.Show();//还可以吗?
========================
问的好
如果
窗体对象2 = 窗体对象;
窗体对象 = null;
窗体对象2.Show()//可以的。窗体对象 = null;是指,“窗体对象”现在不指向任何内存了,但是,他原来指向过的内存还在,只是无法访问到了。
==================
看了这句话如果还不明白这个问题,那就没必要讨论了。
所以,说传值也行,传地址也行吧。因为值就是地址。
————————————————————————————————————
对的。对对象的传值就是对对象的数据堆的传址。与值类型不同。楼上最后说的完全对。
_________________________________________________________________________多谢你的肯定!
不发八卦贴,只能是技术贴,到下班有30个回,我就赢一顿饭谁说周末程序员都Happly去了
//////////////////////////
mobydick(敌伯威|我排著队拿著爱的号码牌) ( ) 信誉:100 Blog 2006-08-25 17:05:00 得分: 0
谢谢,谢谢,谢谢以后的贴,从那贴开始他们把我机器拔了谢谢大家。晚些结!
------------------------------------------------