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#中的所有(是的,也包括引用类型)都是按值传递的。ref
或out
则不是。
但是在引用类型的情况下,按值传递的东西是引用。
int
当然是值类型,DataTable
是引用类型
c#有参数类型。值类型(结构、枚举、数字等)和引用类型(对象、字符串等)。
在第一个例子中,值5
被传递给函数,但在第二个例子中,GridView1
的引用被传递。
请参阅MDN获取定义参数传递方式的值类型和引用类型的列表。
编辑
更好的定义请看harold的回答
DataTable
是一个引用类型。int
是一个值类型
c#按值传递(除非使用了ref
或out
)。
- 当你传递一个
DataTable
给一个方法时,你实际上是在传递一个引用的副本。两个引用都指向同一个对象。对象的修改对调用者是可见的。 - 当你传递一个
int
时,你传递的是值的副本。
如果您使用ref
关键字,它将通过引用传递
有两种ermm…. net中的类型:值类型和引用类型。两者的区别正是您在上面所演示的。
基本上每个struct
都是值类型,每个class
都是引用类型。基本类型(如int、decimal、datetime、byte等)也被实现为结构体,因此它们是值类型。嗯,实际上,它们有点特殊,但它们很像结构体。
MSDN有一篇关于这个的文章,这个话题在其他地方也被广泛讨论过。谷歌一下"值类型vs引用类型"。
这里的区别是基类型(如int型或double型)和对象之间的区别。当你传递一个对象时,你传递的是对它的引用,而使用内部类型时,你传递的是该值的副本。
结构很有趣,因为它们在语法上看起来像类,但它们是通过值(复制)而不是通过引用传递的。