c#指针问题

本文关键字:问题 指针 | 更新日期: 2023-09-27 18:16:06

看一下下面的例子:

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#指针问题

与其他人将要说的相反,默认情况下c#中的所有(是的,也包括引用类型)都是按值传递的。refout则不是。
但是在引用类型的情况下,按值传递的东西是引用

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

c#有参数类型。值类型(结构、枚举、数字等)和引用类型(对象、字符串等)。

在第一个例子中,值5被传递给函数,但在第二个例子中,GridView1的引用被传递。

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

编辑

更好的定义请看harold的回答

DataTable是一个引用类型。int是一个值类型

c#按值传递(除非使用了refout)。

  • 当你传递一个DataTable给一个方法时,你实际上是在传递一个引用的副本。两个引用都指向同一个对象。对象的修改对调用者是可见的。
  • 当你传递一个int时,你传递的是的副本。

如果您使用ref关键字,它将通过引用传递

有两种ermm…. net中的类型:值类型和引用类型。两者的区别正是您在上面所演示的。

基本上每个struct都是值类型,每个class都是引用类型。基本类型(如int、decimal、datetime、byte等)也被实现为结构体,因此它们是值类型。嗯,实际上,它们有点特殊,但它们很像结构体。

MSDN有一篇关于这个的文章,这个话题在其他地方也被广泛讨论过。谷歌一下"值类型vs引用类型"。

这里的区别是基类型(如int型或double型)和对象之间的区别。当你传递一个对象时,你传递的是对它的引用,而使用内部类型时,你传递的是该值的副本。

结构很有趣,因为它们在语法上看起来像类,但它们是通过值(复制)而不是通过引用传递的。