C#指针问题

grj*_*jj3 0 c# pointers reference

看一下下面的例子:

public void inc(int num) {
   num++;
}

int a = 5;
inc(a);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

虽然我甚GridView1DataTable没有在函数中引用它,但所选行将从中导出.所以toObject会更新.看起来

DataTable returnDt = (DataTable)toObject;
Run Code Online (Sandbox Code Playgroud)

实际上是引用了toObject.所以我的问题,为什么在这个例子中它是一个参考,但在第一个,它不是?

har*_*old 12

与其他人要说的相反,默认情况下,C#中的所有内容(也是引用类型)都是按值传递的.随着ref还是out他们不是.
但是在引用类型的情况下,通过值传递的东西是引用.

int当然是值类型,DataTable是引用类型.

  • 提升你,因为你是唯一一个绝对正确的人.其他人,请参阅http://www.mbaldinger.com/post/C-reference-types-are-passed-by-value!.aspx (4认同)

Cha*_*had 6

C#有参数类型.值类型(结构,枚举,数字等)和引用类型(对象,字符串等).

在第一个示例中,值5传递给函数,但在第二个示例GridView1中传递了引用.

请参阅MDN以获取定义参数传递方式的值类型引用类型的列表.

编辑

为了更好的定义,请参阅哈罗德的答案.