引用类型赋值问题

kangxinhua 2007-11-27 10:55:27

DataTable tblBugs = new DataTable("Bugs");
DataColumn newColumn;
newColumn=tblBugs.Columns.Add("BugID",Type.GetType("System.Int32"));
DataColumn bugProductColumn = newColumn;
//把newColumn赋予bugProductColumn
newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));
//然后newColumn被重新赋值

DataColumn bugProductColumn 是引用类型吧,答案应该很肯定:是引用类型.
引用类型的赋值是把引用地址赋给另一个对象,所以当newColumn重新赋值后bugProductColumn也会跟着改变,这是书上说的我这说的应该没错吧???
可是事实却不是这样的,不管下面的代码对newColumn在怎么重新赋值bugProductColumn都不会改变..这好像违背了书上说的!!!难道DataColumn是值类型(好象不太可能),还是newColumn赋值的时候是以newColumn=new newColumn这样的形式赋值的?

谁能给我说说到底是怎么回事呢?
...全文
334 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zj1989 2007-11-28
  • 打赏
  • 举报
回复
LZ没有错,不懂当然要问了。
比不懂却要装懂的人强多了!
帮你顶!
bnb2626 2007-11-28
  • 打赏
  • 举报
回复
newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));
你这句其实是把newColumn的指针改变了,已经指向一个新地址了.
kangxinhua 2007-11-28
  • 打赏
  • 举报
回复
楼上的,我觉得你说话跟放屁似的..以为自己懂点就了不起了
我不懂,那是因为我刚学...如果我厉害还要在这问你吗?
这个论坛本来就是因为不懂才会来问.难道你一开始学就懂了吗?
谁不是从不懂到懂的.不懂就要问....
还有就是我压根就没学过C语言...指针在C#书籍里根本就很少提到..
harryheart 2007-11-27
  • 打赏
  • 举报
回复
“newcolumn是一個變量,這個變量存在於棧中”这句话是错误的吧,你说DataColumn是引用类型,通常引用類型會保存在堆。又说newcolumn这变量存在栈中?你到底说的什么?你是说引用类型存在堆中还是栈中?还是看题目看错了?

引用类型的值是保存在堆上的Class a=new A(); new的A的对象在堆上,a还是在栈上撒
kangxinhua 2007-11-27
  • 打赏
  • 举报
回复
你们还是没说清楚!!!!
boblaw你说的什么我都没明白
首先,
newColumn=tblBugs.Columns.Add("BugID",Type.GetTyp("System.Int32"));

newColumn=tblBugs.Columns.Add("Version",Type.GetType("System.String"));

这2段代码newColumn的值是会改变的,这是第一!!
“newcolumn是一個變量,這個變量存在於棧中”这句话是错误的吧,你说DataColumn是引用类型,通常引用類型會保存在堆。又说newcolumn这变量存在栈中?你到底说的什么?你是说引用类型存在堆中还是栈中?还是看题目看错了?
harryheart 2007-11-27
  • 打赏
  • 举报
回复
Class A=new A();
Class B=A;
A=new A();
这时候A和B就不是同一个地址了撒
ltengteng 2007-11-27
  • 打赏
  • 举报
回复
学习了 帮顶
boblaw 2007-11-27
  • 打赏
  • 举报
回复
lz看懂了下面所述,就不會再有疑問了:

newColumn=tblBugs.Columns.Add("BugID",Type.GetType("System.Int32"));
--------------------
上面的代碼究竟發生了什么呢?
.net的內存保存分為堆和棧,通常引用類型會保存在堆,值類型保存在棧。
1. 由於DataColumn是引用類型,所以在堆上分配了一些空間,保存了tblBugs.Columns.Add方法所生成的DataColumn實例,假設其保存的地址為A.
2. newcolumn是一個變量,這個變量存在於棧中,他指向了1中所述的那個DataColumn對象,所以這個變量在內存中實際上是保存了A這個地址.


newColumn = tblBugs.Columns.Add("Version",Type.GetType("System.String"));
-------------------
3. 同步驟1,也生成了一個新的DataColumn保存在堆中,假設內存地址為B
4. newColumn的設為新生成的這個DataColumn,也就是將他在內存中保存的地址由A變為B


Class A=new A();
Class B=A;
-----------------
不說了,樓主應該明白了吧?
kangxinhua 2007-11-27
  • 打赏
  • 举报
回复
可是如果是这样的话.问题又出来了:
newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));
为什么这样赋值会指向另一个DataColumn对象??
newColumn被重新赋值后newColumn和bugProductColumn地址却不一样了呢??

Class A=new A();
Class B=A;
这样的赋值A和B是同一个地址呢?
kangxinhua 2007-11-27
  • 打赏
  • 举报
回复
可是如果是这样的话.问题又出来了:
newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));
为什么这样赋值会指向另一个DataColumn对象??
newColumn被重新赋值后newColumn和bugProductColumn地址却不一样了呢??

Class A=new A();
Class B=A;
这样的赋值A和B是同一个地址呢?
SaintKaKa 2007-11-27
  • 打赏
  • 举报
回复
变量 内存
newColumn-----------对象1

执行DataColumn bugProductColumn = newColumn;后,让bugProductColumn 保存了newColumn保存的地址(对象1)
相当于bugProductColumn 复制了newColumn保存的地址,后来你改变了newColumn的值,而bugProductColumn复制的值并没有改变。

变量 内存
newColumn-----------对象1
|
bugProductColumn---------|
两个都保存了对象1的地址

执行newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));后newColumn保存了对象2的地址,但是bugProductColumn 保存的仍然是对象1的地址,不是newColumn的地址(即此时bugProductColumn 仅仅与newColumn以前保存的对象1的地址有关)

变量 内存
对象1
|
bugProductColumn--------|
newColumn----------------对象2


此时newColumn已经保存的是对象2的地址

不知道这样的解释你能明白吗?
boblaw 2007-11-27
  • 打赏
  • 举报
回复

newColumn=tblBugs.Columns.Add("BugID",Type.GetType("System.Int32"));
//上面代碼,newColumn變量,指向的是一個DataColumn對象,假設地址為A
DataColumn bugProductColumn = newColumn;
//經過上面的設置,bugProductColumn保存的地址就變成A了
newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));
//newColumn指向另外一個DataColumne對象,假設地址為B
//而bugProductColumn的地址仍然是A!!所以沒有變
boblaw 2007-11-27
  • 打赏
  • 举报
回复
分析一下吧:
newColumn=tblBugs.Columns.Add("BugID",Type.GetType("System.Int32"));
//上面代碼,newColumn變量,指向的是一個DataColumn對象,假設地址為A
DataColumn bugProductColumn = newColumn;
//經過上面的設置,bugProductColumn保存的地址就變成A了
newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));
//newColumn指向另外一個DataColumne對象,假設地址為B
//而bugProductColumn的地址仍然是A!!所以沒有變
卧_槽 2007-11-27
  • 打赏
  • 举报
回复
如果实在看不懂,你还是别干这一行了,太难为你了。
卧_槽 2007-11-27
  • 打赏
  • 举报
回复

DataTable tblBugs = new DataTable("Bugs");
DataColumn newColumn;//定义了一个指针,名字叫newColumn,指向null
newColumn=tblBugs.Columns.Add("BugID",Type.GetType("System.Int32"));//给这个引用类型负值,指针指向一片内存地址,此内存地址由Add方法分配。
DataColumn bugProductColumn = newColumn;//定义新的指针,名字叫bugProductColumn ,指针指向上面一行Add分配的内存空间。

newColumn = tblBugs.Columns.Add("Version", Type.GetType("System.String"));//将指针newColumn的指向地址修改为新分配的内存地址。此时,bugProductColumn 指针的指向并未改变。



楼主学习c语言不到家。基础不扎实,所以弄不清,还是好好学习下吧。
kangxinhua 2007-11-27
  • 打赏
  • 举报
回复
没人留联系方式?
snowdish 2007-11-27
  • 打赏
  • 举报
回复
楼主, 你把引用对象本身,和引用地址搞混了...
kangxinhua 2007-11-27
  • 打赏
  • 举报
回复
黑马王子,留下你的联系方式吧(MSN或E-mail)
以后交流下,我是个新手..
哈哈.....

======================
前面回答问题的人也留下联系方式吧....
boblaw 2007-11-27
  • 打赏
  • 举报
回复
这个方法来赋值的,这个方法隐式的创建了一个变量(對象),然后把这个变量(對象)的值赋给newColumn,这样Column和newColumn(所指向的對象的)地址一样,
而和dataColumn这个地址不一样了,所以newColumn这变量后面怎么赋值都不会改变dataColumn的值

DataColumn Column = tblPeople.Columns.Add("FullName", Type.GetType("System.String"));
------------------
此處DataColumn是聲明Column變量的類型為DataColumn,語法如此,無其他意義!
kangxinhua 2007-11-27
  • 打赏
  • 举报
回复
我自己慢慢找找到,不知道我理解的对不对!!

newColumn = tblPeople.Columns.Add("FullName", Type.GetType("System.String"));

//和下面的代码的等同的:

DataColumn Column = tblPeople.Columns.Add("FullName", Type.GetType("System.String"));
newColumn = Column;



那么newColumn就重新的赋给新的地址了,是和Column这变量的地址一样,我们2个人写的区别是:

你的直接赋值,而我是通过tblPeople.Columns.Add("FullName", Type.GetType("System.String"));

这个方法来赋值的,这个方法隐式的创建了一个变量,然后把这个变量的值赋给newColumn,这样Column和newColumn地址一样,而和dataColumn这个地址不一样了,所以newColumn这变量后面怎么赋值都不会改变dataColumn的值

不知道我说的有没有错,这是我自己的理解!!

你们看看我说的对不对!!!!

===================================================================
我想知道怎么看一个变量在内存中怎么存储的,要怎么看呢?
是在VS.NET的反汇编里看吗?还是.................
加载更多回复(6)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧