看一下下面的例子:
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
.所以我的问题,为什么在这个例子中它是一个参考,但在第一个,它不是?
与其他人要说的相反,默认情况下,C#中的所有内容(也是引用类型)都是按值传递的.随着ref
还是out
他们不是.
但是在引用类型的情况下,通过值传递的东西是引用.
int
当然是值类型,DataTable
是引用类型.
C#有参数类型.值类型(结构,枚举,数字等)和引用类型(对象,字符串等).
在第一个示例中,值5
传递给函数,但在第二个示例GridView1
中传递了引用.
请参阅MDN以获取定义参数传递方式的值类型和引用类型的列表.
编辑
为了更好的定义,请参阅哈罗德的答案.