很菜的问题 但不一定能回答的很清楚
对于对象理解的不深,所以经常混淆
比如 类A 类B
A a1=new A(can) //can表示参数。
这条语句是不是意味着。
1 声明一个类A的对象变量 a1. 在堆上。
2 创建一个参数为can的类A的实例。(不知道在哪)
3 将类A的实例(参数为can)的内存地址 赋值给对象变量a1.
也就是a1在内存中存储的是个地址,地址指向的内存空间的值是类A的实例(参数为can)。
再深入一些,那实例存储的时候,如果有许多属性之类的,是怎么存储呢?
因为经常见到a1.p=8 这样的语句。如果a1只是存储了一个指针,那么a1.p怎么理解呢?
不知理解的是否正确。呵呵,因为一直只对数值型的运算与赋值较熟悉,对这种引用类型的一直理解的不透。
还有另外一种:
D是一个委托。H是一个函数或者方法。
D d1=new D(H)
该怎么理解呢?
还有 K P都是数组 长度一样 类型也一样
那么 K=P 表示什么?
是把P[i]存储的指针赋给了K[i]?而真正指针对应地址的值没有变化,而且没有其他的副本。是这样吗?
------解决方案--------------------将类A的实例(参数为can)的内存地址 赋值给对象变量a1
-------------
new A(can)的时候,在堆上面有了这样一个实例。
它应该有一个隐藏的对象名字 (A a = new A());
a 指向了堆上该实例的地址;
A a1=new A(can)操作后,a1也指向了a所指的地址。
如果a1只是存储了一个指针,那么a1.p怎么理解呢?
---------------
a1是指针,通过它可以找到实例在堆上的位置。
再通过a1.p就找到p的数值。//类似,数组名和下标关系
假设A a = new A(can)实例的地址是:xxxxxx
有个字符串 stirng s = "xxxxxx ";
试想a 和 s的区别。
------解决方案--------------------1 声明一个类A的对象变量 a1. 在堆上。
a1在栈上,就像声明一个int i1,i1在什么地方,a1也一样;
2 创建一个参数为can的类A的实例。(不知道在哪)
堆上
3 将类A的实例(参数为can)的内存地址 赋值给对象变量a1
正确
委托可以简化理解为函数指针,那一句可以近似为声明一个指针然后指向函数
数组应该是只把对象指针改变指向了,你当作对象赋值即可
很久不用C#写程序了,不能保证完全准确,你还是找本比较全面的书看看好