public function main()
{
DataTable dt=New DataTable();
A(dt);
//dt没有人和变化
}
public function A(DataTable dt)
{
...//dt会做很多变化
}
按道理,dt在A函数中的影响会直接传回main函数,但是现在怪现象出现了,我无论我在A中如何处理dt,main里的dt都不会变化,但是如果使用ref就有效。补充一点,我现在运行的生产作业系统就不用ref就可以产生作用。一模一样的代码,在本地调试却行不通。请问各位如何处理?大家是否遇到过?是不是我的VS2005的编译器选项不对?
{
DataTable dt=New DataTable();
A(dt);
//dt没有人和变化
}
public function A(DataTable dt)
{
...//dt会做很多变化
}
按道理,dt在A函数中的影响会直接传回main函数,但是现在怪现象出现了,我无论我在A中如何处理dt,main里的dt都不会变化,但是如果使用ref就有效。补充一点,我现在运行的生产作业系统就不用ref就可以产生作用。一模一样的代码,在本地调试却行不通。请问各位如何处理?大家是否遇到过?是不是我的VS2005的编译器选项不对?
一个引用类型,比如System.Array类,作为参数向一个方法传递时,传送的是指针,但是这两种代码是不是就意味着等效?void Test(Array a)和void Test(ref Array a)结果是并不完全等效。如果在函数内部调用构造函数新建了对象并赋予参数,则函数外的变量不会受影响;
比如a = new ...如果只是改动该参数(一个对象)的字段,则会有影响,此时加不加ref都是等效的。
比如a[i] = ...
确实比较奇怪,说不定有一定的关系...遇到这样的问题,确实比较郁闷..
尝试过,用ref就可以解决。关键,整个工程里有很多啊,难道真的要来一次重构?
传递引用 和传递 ref 引用的区别,是第一个传递指针,第二个是传递指向指针的指针,所以第一个你可以修改那个指针指向的内容,但不能修改指针本身的地址,第二个则可以修改指针地址up ~PS:很到位~~
因为ref指的是同一变量,它都能改变变量的指向。void Test(Object a)和void Test(ref Object a)
根本就不是一回事。只要这个Object的内容是可修改的,那就就用第一种形式好了
在A函数里面如果不使用dt=new DataTable()语句,则在A中处理dt,main里的dt都会变化,
因为main()里的dt和A里的dt是DataTable类的同一个实例,只是在A中改变了它的值,作用域在main()中没有发生变化。
如果在A中有dt=new DataTable()语句,相当于重新定义DataTable类的新实例,此dt已非彼dt,
dt的作用域此时只在A中有效,也就是说A中的dt根本和main里面的dt已不是同一个实例,在A里面根本就没有对main()里面的dt做任何改变。
所以我估计是楼主在A里面使用了dt=new DataTable()语句的缘故。
除非用ref
就是指针(*)和引用(&)的区别.
void mothod(DataTable dt) 传递的是dt变量所指向的内存空间
void mothod(ref DataTable dt) 传递的是dt变量本身的内存地址
所以c++中把引用变量看作是一个变量的别名.
{
DataTable dt=New DataTable();
dt=A(dt);
//dt没有人和变化
}
public DataTable function A(DataTable dt)
{
...//dt会做很多变化
return dt;
}
这样看看,因为函数中的dt不会影响main中的dt,所以让他处理后重新赋值看看
实例参数是另外开辟存储单元,当然就不会返回值。要想返回值就两种方法, 一种return,另外一种就是使用引用参数 ref或者out
作用域之故也,除非用 ref 或 out 作为dt的传递类型,
又或者A()的参数为空,在main外将dt设为全局变量,
然后在A()里对dt的任何修改都会影响到main里的dt内容。
{
DataTable dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
DataRow dr = dt.NewRow();
dr["A"] = "1";
dr["B"] = "2";
dt.Rows.Add(dr);
dt = A(dt);
MessageBox.Show(dt.Rows[0][0].ToString());
}
private static DataTable A(DataTable dt)
{
dt.Rows[0][0] = "3";
return dt;
}我这样写,A中的改变会影响Main中的dt。
{
obj = new refobject();
...
}
func2(refobject obj)
{
//without obj = new refobject();
...
}
main()
{
refobject obj = new refobject();
func1(obj);//will not change obj
func2(obj);//will change obj
func1(ref obj);//will change obj
}
我个人也是这样认为的,比较赞同
new一个后就会产生一个新的,和调用函数中的对象脱离关系
但是,如果lz没有new过的话,感觉就很奇怪了
可以把你A函数的写法贴出来看看吗
public static main()
{
DataTable dt=New DataTable();
Console.WriteLine(dt.columns.count);
A(dt);
Console.WriteLine(dt.columns.count);
}public static void A(DataTable dt)
{
dt.Columns.add(new DataColumn(ddd));
}
--我觉得你应该好好复习一下.net的值对象和引用对象的概念
--我建议大家不要凭空推测,有些很简单的东西,一做实验就清楚了。
{
l.Items.Add("aaaaaaaaaaaaa");
} private void button1_Click(object sender, System.EventArgs e)
{
System.Windows.Forms.ListBox l = new ListBox();
l.Items.Add("a");
this.listBox1.Items.Add(l.Items.Count);
this.add(l);
this.listBox1.Items.Add(l.Items.Count);
}是t m d 挺怪 不用ref 也好使
{
dt = "aaaaaaaaaaaaaa";
} private void button1_Click(object sender, System.EventArgs e)
{
string dt = "bbbbbbbbbbbbbb";
this.listBox1.Items.Add(dt);
this.update(ref dt);
this.listBox1.Items.Add(dt);
}
这样就非得加ref才好使,,,
基本判断,是微软的原因了,生产系统代码拷贝下来执行都不行,而生产系统却好好的,否则用户早就跳了。