C# 参数传递类型
来源:互联网 发布:录制视频软件电脑 编辑:程序博客网 时间:2024/05/20 07:37
转自【freegodlee】
没有指明ref或者out的,就是按值传递
返回值没地方指明ref或者out,所以肯定是按值传递, 但是要搞清楚这里的“值”是什么意思一个变量保存一个值。如果这个变量的类型是“值类型”(ValueType,包括所有基础数据型和结构型),它保存的值就是真正的数据;如果这个变量的类型是“引用类型”,它保存的值就是一个地址,在内存的这个地址里能找到对象的具体数值。
这么说可能就搞糊涂了,我具体化一点。
DataSet a = ...;
B(a);
void B(DataSet ds) {
ds.Tables[0].Rows[0][0] = "123"; //1
ds = new DataSet(); //2
}
上面的例子里,参数没有ref/out,所以是按值传递。但是当主程序调用 B(a) 的时候,按值传递传了什么东西?——引用类型,传了 a 所指的 DataSet 对象的地址。于是,主程序的 a 和 B 方法里的 ds,引用的是同一个对象,于是第一行对 ds 的改动,主程序的 a 也相应的被改动了。但是方法 B 的第二行,将 ds 赋予另一个 DataSet 的地址。结果是 ds 的值变了,但是 a 的值没变,a 仍然指着原先的 DataSet。
再来看另一个例子。
DataSet a = ...;
B(ref a);
void B(ref DataSet ds) {
ds.Tables[0].Rows[0][0] = "123"; //1
ds = new DataSet(); //2
}
现在,参数指定是按引用传递。这是什么效果?a 和 ds 变成是同一个东西,不但所指的 DataSet 是同一个 DataSet(值相同),他们本身的地址也相同。于是,方法第一行对 DataSet 对象的改动,和方法第二行对变量值的改动,都返回给主程序了,也就是方法执行之后,a 也指向了一个新的 DataSet。
最后来看“返回值”。
DataSet a = B();
DataSet B() {
DataSet ds = new DataSet(); //1
ds.Tables[0].Rows[0][0] = "123";
return ds; //2
}
上例里,主程序先为 a 分配了内存并且指定它的数据类型为 DataSet,然后调用方法 B。方法 B 里为 ds 分配了内存并且指定其类型为 DataSet——这样说,很明显 a 和 ds 是不同的两个变量了。然后第2行返回 ds。我开头说过了,因为返回值没有而且无法指定ref或者out,所以它只能是值类型,也就是说,return ds; 返回的是 ds 的值。ds 的值是什么?是一个地址,这个地址指向一个刚刚创建的 DataSet。返回之后,变量 a 就赋予了这个值,也就是指向刚才那个 DataSet 的地址,于是整个故事只存在一个 DataSet 对象,但是,存在两个不同的变量,a 和 ds。
“一般我们在函数调用,传递类做参数,想在函数中对传递的类进行修改时,常会显式加上ref或out,认为这样效率高些”,这是没有必要的。
- c# 参数传递类型
- C# 参数传递类型
- C#中传递参数的类型
- C#参数传递类型及机制
- C#参数传递(值类型、引用类型)
- 传递引用类型参数(C# 编程指南)
- C#下实现SQL Server 2008表类型参数传递
- C#下SQL Server 2008表类型参数传递
- 传递引用类型参数(C# 编程指南)
- C++/CX支持C#传递可空类型参数
- C#中的参数传递
- C#中的参数传递
- C#中的参数传递
- C#的参数传递
- C#多线程参数传递
- C#多线程参数传递
- C#多线程参数传递
- c#参数传递
- 成功演讲的3 个技巧
- Accelerated C++ Exercise 6-2
- (Relax 数论1.8)POJ 1284 Primitive Roots(欧拉函数的应用: 以n为模的本原根的个数phi(n-1))
- HTTP、TCP/IP协议的关系及详细介绍
- C# 互操作性入门系列(四):在C# 中调用COM组件
- C# 参数传递类型
- 好的开始,是成功的一小半
- Android仿QQ微信开场导航以及登陆界面
- MFC多线程编程之一———问题提出及多线程编程简介
- Scribes
- AdapterView及其子类之二:使用ListActivity及ArrayAdapter创建列表
- Android仿QQ微信开场导航以及登陆界面
- 谈谈技术原则,技术学习方法,代码阅读及其它(正文)
- 《UNIX环境高级编程》创建临时文件