【发布时间】:2011-11-28 21:31:51
【问题描述】:
看看下面的例子:
public void inc(int num) {
num++;
}
int a = 5;
inc(a);
在这种情况下,inc 不会增加 a 变量本身。它没有指向内存中的相同位置。为了更改a,我必须使用ref。
然而,在这个例子中
public static void ExportSelectedRow(GridView gridView, object toObject, int skipCols)
{
GridViewRow gridViewRow = gridView.SelectedRow;
if (toObject is DataTable)
{
DataTable returnDt = (DataTable)toObject;
GridViewColsToDatatable(gridView, returnDt, skipCols);
DataRow dr = returnDt.NewRow();
for (int i = skipCols; i < gridViewRow.Cells.Count; i++)
dr[i - skipCols] = gridViewRow.Cells[i].Text;
returnDt.Rows.Add(dr);
}
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) {
DataTable dt = new DataTable();
GridViewHelper.ExportSelectedRow(GridView1, dt, 1);
...
}
选定的行将从GridView1 导出到DataTable,尽管我什至没有在函数中引用它。所以toObject 将被更新。看来
DataTable returnDt = (DataTable)toObject;
实际上是在引用toObject。所以我的问题是,为什么在这个例子中它是一个参考,但在第一个例子中,它不是?
【问题讨论】:
-
请注意,'ref' 参数值实际上是对字段、局部变量或数组元素的类型化引用——它不是指针。可以将其视为“对被调用代码中变量的更改应该导致对调用代码中变量的更改”。它是从引用发生方式的底层实现中抽象出来的,它比指针受到更严格的约束(它可能引用内存中的任何地方,而类型化引用受到高度限制。)