C#数组元素是引用吗?

evlon 2006-08-24 03:36:06
大家看一下,下面的程序.如果我想让msg1 == msg2 ,应该如何写呀?
在C++中,我可以声明引用,我本想,在C#是就是引用.可是为什么不行呢?
请高手指教..

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Net;
using System.IO;
using System.Web;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
public class ValueData
{
private object data1;
private object data2;
private object data3;

public object Data1
{
get { return data1; }
set { data1 = value;}
}
public object Data2
{
get { return data2; }
set { data2 = value;}
}
public object Data3
{
get { return data3; }
set { data3 = value;}
}
}
public class MainEntry
{
public static void Main(string[] arg)
{
ValueData vd = new ValueData();
object[] vals = {(object)vd.Data1,(object)vd.Data2,(object)vd.Data3};
for(int i = 0;i < vals.Length; ++i)
{
vals[i] = new object();
}

string msg1 = string.Format("{0}\n{1}\n{2}\n",vd.Data1,vd.Data2,vd.Data3);
System.Diagnostics.Debug.Assert(msg1.Trim() == "");
MessageBox.Show(msg1);
string msg2 = string.Format("{0}\n{1}\n{2}\n",vals[0],vals[1],vals[2]);
System.Diagnostics.Debug.Assert(msg1.Trim() != "");
MessageBox.Show(msg2);
}
}

...全文
577 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
starhand 2006-08-25
  • 打赏
  • 举报
回复
学习
evlon 2006-08-24
  • 打赏
  • 举报
回复
好了.我换用别的方式吧.结帖去.
Knight94 2006-08-24
  • 打赏
  • 举报
回复
按照你这种方式,你会更麻烦。
evlon 2006-08-24
  • 打赏
  • 举报
回复
不是呀,按照C++的思路,任何变量都是有地址的,

void* p = NULL
void**p = &p;
p != 0
Knight94 2006-08-24
  • 打赏
  • 举报
回复
yun~

当引用类型没有初始化,你用指针也是白搭。
evlon 2006-08-24
  • 打赏
  • 举报
回复
TO:zhaoyingqi(芹菜)

用非托管代码写一个方法返回data1的地址,在你的main方法中用非托管代码用那个data1地址进行操作,思路如此,实现自己写吧,还有问题可以加我QQ:8738184讨论

============================================
这个和我想到一块了.
fds2003 2006-08-24
  • 打赏
  • 举报
回复
在类里面用索引器不行吗?
芹菜大哥 2006-08-24
  • 打赏
  • 举报
回复
用非托管代码写一个方法返回data1的地址,在你的main方法中用非托管代码用那个data1地址进行操作,思路如此,实现自己写吧,还有问题可以加我QQ:8738184讨论
芹菜大哥 2006-08-24
  • 打赏
  • 举报
回复
想了想你的问题,你在数组中得到的只是data1所指的对象的引用,如果想实现你说的功能,你应当得到的是对data1的引用(在c++中应当是data1的地址)然后对那个data1进行赋值才会反映到原来的实例中,关键是你怎么得到data1的引用
idda 2006-08-24
  • 打赏
  • 举报
回复
嗯,索引器是正解.
evlon 2006-08-24
  • 打赏
  • 举报
回复
TO:zhaoyingqi(芹菜)

感谢您,终于知道我在说什么.看来我说的还是可以让人能听懂的,哈.
evlon 2006-08-24
  • 打赏
  • 举报
回复
要是能宣言一个这样的Array就更好了.

List<ref object> list = new List<ref object>

哈.
芹菜大哥 2006-08-24
  • 打赏
  • 举报
回复
呵呵,知道你是在想类(实例)外面初始化类成员,不过你这种做法也太麻烦了,即使c#支持指针,想实现你的想法也是很困难的,自己琢磨去吧
evlon 2006-08-24
  • 打赏
  • 举报
回复
TO:Knight94(愚翁)

是的,还是你明白我,但是上面的ValueData是以前的.下面只是我的一个操作.

ValueData 是不能改的,就是这样了.

要是我自己写,我才不这样写.
evlon 2006-08-24
  • 打赏
  • 举报
回复
TO:zhaoyingqi(芹菜)

唉,你上面的也是不能工作的.你还没有明白 Knight94(愚翁) 的意思.
你上面的代码:

vals[i] = i.ToString();

换成:

vals[i].Append(i.ToString());

才是正确的.

=============================================
但是你还是不明白我在说什么.唉.

芹菜大哥 2006-08-24
  • 打赏
  • 举报
回复
这时数组得到的才是那个对象的引用,而且只是在对引用对象的值进行修改;还是刚才的问题,为什么你用string不行?
芹菜大哥 2006-08-24
  • 打赏
  • 举报
回复
直说吧
object[] vals = {(object)vd.Data1,(object)vd.Data2,(object)vd.Data3};
最终结果是object[] vals = {null,null,null};
你紧跟其后的那条语句只是把数组的每个元素用实例填充了一下,并不是在操作vd的data1,data2,data3的引用,这点你如果不明白确实是需要再看书的;

至于你想要的解决办法,可以像下面这样:(给你留一个问题:你用string为什么不行?)
public class ValueData
{
private StringBuilder data1=new StringBuilder("");
private StringBuilder data2=new StringBuilder("");
private StringBuilder data3=new StringBuilder("");

public StringBuilder Data1
{
get { return data1; }
set { data1 = value;}
}
public StringBuilder Data2
{
get { return data2; }
set { data2 = value;}
}
public StringBuilder Data3
{
get { return data3; }
set { data3 = value;}
}
}
public class MainEntry
{
public static void Main(string[] arg)
{
ValueData vd = new ValueData();
StringBuilder [] vals = {vd.Data1,vd.Data2,vd.Data3};
for(int i = 0;i < vals.Length; ++i)
{
vals[i] = i.ToString();
}

string msg1 = string.Format("{0}\n{1}\n{2}\n",vd.Data1,vd.Data2,vd.Data3);
System.Diagnostics.Debug.Assert(msg1.Trim() == "");
MessageBox.Show(msg1);
string msg2 = string.Format("{0}\n{1}\n{2}\n",vals[0],vals[1],vals[2]);
System.Diagnostics.Debug.Assert(msg1.Trim() != "");
MessageBox.Show(msg2);
}
}
Knight94 2006-08-24
  • 打赏
  • 举报
回复
我估计你也是想操作方便,用索引器可以达到你的效果。
Knight94 2006-08-24
  • 打赏
  • 举报
回复
为什么不用索引器呢,例如:
public class ValueData
{
public object[] DataArray = null;

public ValueData( )
{
DataArray = new object[3];
}
public object this[int Index]
{
get{ return DataArray[Index];}
set{ DataArray[Index] = object;}
}
}
evlon 2006-08-24
  • 打赏
  • 举报
回复
只可惜不能这样写,哈哈.
加载更多回复(18)

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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