C#传递参数大集合
2013-11-14 20:06
267 查看
方法的参数是个值得特别注意的地方。方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。
传值参数示例:
class Program
{
static void Main(string[] args)
{
string m = "m";
string n = "n";
Console.Write("传值参数调用函数之前的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n\n");
Swap(m, n);
Console.Write("传值参数调用函数之后的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n");
Console.Read();
}
private static void Swap(string m, string n)
{
string temp;
temp = m;
m = n;
n = temp;
}
}
运行效果:
在调用交换值得方法之后m和n的值仍未改变。
传址参数示例:
class Program
{
static void Main(string[] args)
{
string m = "m";
string n = "n";
Console.Write("传值参数调用函数之前的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n\n");
Swap(ref m, ref n);
Console.Write("传值参数调用函数之后的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n");
Console.Read();
}
private static void Swap(ref string m, ref string n)
{
string temp;
temp = m;
m = n;
n = temp;
}
}
执行效果:
在调用了传址函数之后结果明显发生了变化。
输出参数示例:
class Program
{
static void Main(string[] args)
{
string m, n;
Swap(out m, out n);
Console.Write("传值参数调用函数之后的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n");
Console.Read();
}
private static void Swap(out string m, out string n)
{
m = "m";
n = "n";
string temp;
temp = m;
m = n;
n = temp;
}
}
运行效果:
运行的结果页发生了变化。
由此可知:传址和输出两个的运行效果是相同的,但是他们之间也是有区别的。ref在使用的时候参数必须在调用函数之前进行赋值,而out在使用的时候参数无需之前进行赋值,但是必须进行定义。总结一下可以说是:系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要在函数内赋一个值,或者说函数承担初始化这个变量的责任。
传值参数示例:
class Program
{
static void Main(string[] args)
{
string m = "m";
string n = "n";
Console.Write("传值参数调用函数之前的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n\n");
Swap(m, n);
Console.Write("传值参数调用函数之后的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n");
Console.Read();
}
private static void Swap(string m, string n)
{
string temp;
temp = m;
m = n;
n = temp;
}
}
运行效果:
在调用交换值得方法之后m和n的值仍未改变。
传址参数示例:
class Program
{
static void Main(string[] args)
{
string m = "m";
string n = "n";
Console.Write("传值参数调用函数之前的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n\n");
Swap(ref m, ref n);
Console.Write("传值参数调用函数之后的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n");
Console.Read();
}
private static void Swap(ref string m, ref string n)
{
string temp;
temp = m;
m = n;
n = temp;
}
}
执行效果:
在调用了传址函数之后结果明显发生了变化。
输出参数示例:
class Program
{
static void Main(string[] args)
{
string m, n;
Swap(out m, out n);
Console.Write("传值参数调用函数之后的值\n" + "m的值为:" + m + "\n" + "n的值为:" + n + "\n");
Console.Read();
}
private static void Swap(out string m, out string n)
{
m = "m";
n = "n";
string temp;
temp = m;
m = n;
n = temp;
}
}
运行效果:
运行的结果页发生了变化。
由此可知:传址和输出两个的运行效果是相同的,但是他们之间也是有区别的。ref在使用的时候参数必须在调用函数之前进行赋值,而out在使用的时候参数无需之前进行赋值,但是必须进行定义。总结一下可以说是:系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要在函数内赋一个值,或者说函数承担初始化这个变量的责任。
相关文章推荐
- c#asp.net url 传递中文参数要使用 System.Web.HttpUtility.UrlEncode 而不能使用Server.UrlEncode
- [转]c#中通过值和引用传递参数
- 在c#中执行sql语句时传递参数的小经验
- C#页面后台前台传递参数
- C#学习笔记:参数传递(详解)
- 传递引用类型参数(C# 编程指南)
- 在c#中执行sql语句时传递参数的小经验
- 我理解c#(一): 参数传递和变量复制之间的关系
- C# 函数参数传递(按值和引用)
- C#调用C++写的dll 函数传递参数问题,请有经验的人详细描述
- c#中通过值和引用传递参数(downmoon)
- C#中方法中的参数传递
- C#学习笔记一--C#中的参数传递
- C#参数传递的几点总结(转)
- c#中通过值和引用传递参数
- C# multithread,threadpool,ParameterizedThreadStart,传递参数给线程以及回调
- C#线程间传递参数
- C#调用C++编写的DLL函数各种参数传递问题
- C#方法参数传递-同时使用ref和out关键字
- C#参数传递:值传递和引用传递