C#参数传递方式及使用情境
2011-11-08 19:29
267 查看
一、 参数的一般传递方式
在c#中,除非使用ref或者out前缀,所有参数都通过值来传递。变量的栈数据会完整复制到目标参数中。分为以下3种情况:
1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。如果在方法内部将内存地址指向一个新对象,则方法结束后在方法中所作的修改会被丢弃(原指针仍指向原对象,方法参数指向新对象,结束后一起销毁)。
该程序输出为
2、 值类型对象包含的是实际数据,传递给方法的是数据本身的副本,对值类型对象的修改在方法结束后会被丢弃。
3、 String类型在实际使用中当做值类型对待。
二、 参数的特殊传递方式
1、 ref参数
作用:迫使值参数通过引用传送给方法。
2、 out参数
作用:在参数未初始化的情况下,在一个函数中输出多个值。隐含ref。
C#要求变量在被引用前必须初始化。尽管在传递前,可以用没有意义的值初始化他们,然后用ref引用传递,但有时会引起混乱。用out可以使参数在未初始化情况下使用,逻辑性更强。
3、 params数量可变参数
作用:自动把参数转为数组。
调用方法有两种,见示例。
三、 传递参数注意事项:
1、 属性不是变量,因此不能传给 out 或ref参数
2、 除非使用out前缀,所有参数必须在使用前初始化。
3、 out参数必须在函数结束前赋值,赋值null也可以。
在c#中,除非使用ref或者out前缀,所有参数都通过值来传递。变量的栈数据会完整复制到目标参数中。分为以下3种情况:
1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。如果在方法内部将内存地址指向一个新对象,则方法结束后在方法中所作的修改会被丢弃(原指针仍指向原对象,方法参数指向新对象,结束后一起销毁)。
class Program { static void Main(string[] args) { Employee myE = new Employee() { id=4}; Console.WriteLine("初始化为:"+myE.id); testMethod(myE); Console.WriteLine("退出方法后:"+myE.id); Console.ReadLine(); } static void testMethod(Employee myE) { //myE.id = 5; myE = new Employee() { id = 5 }; Console.WriteLine("更改为:"+myE.id); } } class Employee { public int id { get; set; } }
该程序输出为
2、 值类型对象包含的是实际数据,传递给方法的是数据本身的副本,对值类型对象的修改在方法结束后会被丢弃。
3、 String类型在实际使用中当做值类型对待。
二、 参数的特殊传递方式
1、 ref参数
作用:迫使值参数通过引用传送给方法。
2、 out参数
作用:在参数未初始化的情况下,在一个函数中输出多个值。隐含ref。
C#要求变量在被引用前必须初始化。尽管在传递前,可以用没有意义的值初始化他们,然后用ref引用传递,但有时会引起混乱。用out可以使参数在未初始化情况下使用,逻辑性更强。
3、 params数量可变参数
作用:自动把参数转为数组。
调用方法有两种,见示例。
static string Combine(params string[] paths) { string result = string.Empty; foreach (string path in paths) { result = System.IO.Path.Combine(result, path); } return result; } static void test() { //调用方法1,直接输入,如果不使用params前缀就不能用这种方式 string path1 = Combine("", "", ""); //调用方法2,string数组,不使用params前缀也能用这种方式 string path2 = Combine(new string[] {"","","" }); }
三、 传递参数注意事项:
1、 属性不是变量,因此不能传给 out 或ref参数
2、 除非使用out前缀,所有参数必须在使用前初始化。
3、 out参数必须在函数结束前赋值,赋值null也可以。
相关文章推荐
- 黑马程序员 C#参数传递方式及使用情境
- C#参数传递方式及使用情境
- c#使用线程传递参数的主要几种方式
- @Param 注解在Mybatis中的使用 以及传递参数的三种方式
- @Param注解在Mybatis中的使用 以及传递参数的三种方式
- C#使用Http Post方式传递Json数据字符串调用Web Service
- servlet(三)-如何使用传参-三种转发方式、传递参数以及对象中数据的范围
- C# 使用自定义线程类向线程传递参数
- C#参数传递方式
- C#、VB.NET、C++.NET中的按引用传递参数的方式比较
- C# 使用Tuple传递多个参数
- WebService,ASMX文件使用XML格式数据传递参数、验证与获取XML格式返回值的一种方式
- C#中使用OpenGL:(六)C#中调用C函数时的参数传递问题
- \t\t在MSSQL中定义和使用C#自定义类型 SQL Server08表类型参数传递
- C#给线程传递参数有3种方式
- servlet(三)-如何使用传参-三种转发方式、传递参数以及对象中数据的范围
- Struts2中使用GET方式传递中文参数出现乱码的解决方案
- c#asp.net url 传递中文参数要使用 System.Web.HttpUtility.UrlEncode 而不能使用Server.UrlEncode
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- 使用Get方式传递中文参数的问题乱码问题