看看下面的例子:C#指针问题
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'参数值实际上是对字段,局部变量或数组元素的类型化引用 - 它不是指针。可以认为它是“对被调用代码中变量的更改应该会导致对调用代码中的变量进行更改”。它是从引用发生的底层实现中抽象出来的,并且比指针(它可能指向内存中的任何位置,而类型化引用受到高度限制)更加严格。 –