关于C#中数组是引用类型的问题

class Program {
static List<taskClas> m_listCla = new List<taskClas>();
static void Main(string[] args)
{
taskClas cla1 = new taskClas();
cla1.nValue = 1;
cla1.strValue = "1";
m_listCla.Add(cla1);

taskClas cla2 = new taskClas(); cla2.nValue = 2;
cla2.strValue = "2";
m_listCla.Add(cla2);

SetValue( cla1); Console.Write(cla1.nValue + "\r\n");
Console.Write(cla1.strValue + "\r\n");
Console.Write(m_listCla[1].GetType().IsValueType + "\r\n");
Console.Write(cla1.GetType().IsValueType + "\r\n");
}
static void SetValue( taskClas task)
{
task = m_listCla[1];
// task.nValue = 2;
// task.strValue = "2";
}
}
public class taskClas
{
public int nValue;
public string strValue;
}

不是说数组是引用类型的吗,我在SetValue函数里的改变难道不起作用?为什么输出为:1“1”falsefalse应该是2,“2”,false false才对啊

我试了一下你的程序,结果是:SetValue函数好像真的不起作用。

SetValue函数中变量task中nValue和strValue的地址是指向了m_listCla[1]中nValue和strValue的地址,但是函数完成后并没有改变cla1。就好像我们经常用的形参似的,它只是一个备份,修改它,但不会修改原始的那份,备份利用完后就被抛弃销毁了。

 

明明传递的是类的实例,一个引用类型,但就是没有被改变,不理解(可能是这个static void SetValue( taskClas task)函数的原因)

 

在你的基础上改动了一下:

1, static taskClas  SetValue(taskClas task)

2, cla1 = SetValue(cla1);

结果正常

 

希望有高手前来啊

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-19
static void SetValue( taskClas task)
{
task = m_listCla[1];
// task.nValue = 2;
// task.strValue = "2";
}
}

你这个函数里面 task.nValue = 2,和task.strValue不是被注释了吗?去掉注释。。

你要输出
Console.Write(cla1.nValue + "\r\n");
Console.Write(cla1.strValue + "\r\n");

你是要修改cla1的值。但是你没有地方为cla1重新赋值。

引用类型是表示可以用地址传参。本回答被网友采纳
第2个回答  2013-03-21
static void SetValue( taskClas task)
{
task = m_listCla[1];
// task.nValue = 2;
// task.strValue = "2";
}
函数的参数,入口如果没有标明ref,out,编译器会声明一个局部引用变量task,作用于函数内部。函数执行完自动销毁。也就是所谓的局部变量,在C#里不管引用类型或者值类型,函数传值没有标明ref,out,都是拷贝原值的一个副本。希望能帮助你!
第3个回答  2013-03-20
static void SetValue(ref taskClas task)

SetValue(ref cla1);

这样可以不?不知道什么引用类型,ref表示地址传递,我见过的能在方法里改变又不用写ref关键字的都是对象类型,Control类的,其他的没有见过。