C#传递参数
与函数交换数据的最好方式就是传递参数,在C#中有四种方法来控制参数如何传递给目标方法
C#中的参数修饰符
| 无修饰 | 如果一个参数没有用参数修饰符,则认为它将按值传递 |
| out | 输出参数由被调用的方法赋值。因此它按引用传递 |
| ref | 调用者赋初值,并且可以由被调用的方法可选地重新赋值,因此数据也是按照引用传递的 |
| params | 将一组可变数据的参数作为单独的逻辑参数进行传递 |
下面来一一介绍
默认传参
static int Multiply(int a, int b)
{
int ans = a * b;
a = 100;
b = 315;
return ans;
}
在主函数中进行调用
static void Main(string[] args)
{
Console.WriteLine("**********默认传参行为********\n");
int a = 19, b = 25;
Console.WriteLine("调用之前的:a={0},b={1}", a, b);
Console.WriteLine("调用函数的结果:{0}", Multiply(a, b));
Console.WriteLine("调用之后的: a={0},b={1}", a, b);
Console.WriteLine();
Console.ReadKey();
}
输出结果:
通过输出结果可知:a和b的值,在调用函数Multiply(int a,
int b) 前后的值保持不变,虽然在Multiply(int a,
int b)函数内部试图修改a和b的值,但实际上修改的只是a,b值的副本;a,b原来的值不变
输出参数out
out修饰,即定义为输出参数,当定义为输出参数时,必须在退出方法之前给参数一个恰当的值,否则会产生编译错误
以下是带out参数的方法
static void FunWithOut(int x,int y,out int ans)
{
ans = x + y;
}
调用一个带有输出参数的方法,也必须是用out修饰符。需要注意的是:作为输出变量的本地变量不需要赋值,否则原来的值会丢失
FunWithOut(110, 120, out ans);
Console.WriteLine("110+120={0}", ans);
Console.ReadKey();
我们知道使用return 一次只能返回一个返回值,而使用out参数则可以通过一次调用,获取多个返回值
例如:
static void ReturnValues(out int a,out int b,out string c,out bool d)
{
a = 120;
b = 119;
c = "This is a demo";
d = false; }
Console.WriteLine("**********带有out参数,输出多个值********\n");
int a; int b; string c; bool d;
ReturnValues(out a, out b, out c, out d);
Console.WriteLine("输出结果:\n a={0}\n b={1}\n c={2}\n d={3}\n",a,b,c,d);
Console.ReadKey();
引用参数ref
引用参数,可以对调用者作用域中声明的不同数据进行操作。比如可以用引用参数来实现排序和交换等操作
下面是交换两个值的实例:
public static void SwapValues(ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
}
调用函数
static void Main(string[] args)
{
Console.WriteLine("**********带有ref参数********\n");
int a = 123;
int b = 456;
Console.WriteLine("调用之前的:a={0} b={1}", a, b);
SwapValues(ref a, ref b);
Console.WriteLine("调用之后的:a={0} b={1}", a, b);
Console.ReadKey(); }
参数数组params
使用params修饰符可以把相同类型可变数量的参数作为一个逻辑参数传递给方法,比如下面的函数,可以接收任意个int类型的数,并且返回它的平均值
static int ReturnAverage(params int[] values)
{
Console.WriteLine("参数数组的长度{0}", values.Length);
int sum = 0;
if(values.Length==0)
{
return sum;
}
for(int i=0;i<values.Length;i++)
{
sum += values[i];
}
return (sum / values.Length);
}
static void Main(string[] args)
{
Console.WriteLine("**********带params的参数数组********\n");
int average;
Console.WriteLine("**********用列表调用********\n");
average = ReturnAverage(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Console.WriteLine("传入参数的平均值为{0}", average); Console.WriteLine("**********用数组调用********\n"); int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Console.WriteLine("传入参数的平均值为{0}", ReturnAverage(data));
Console.ReadKey(); }
C#语言中,要求方法只能有一个params参数修饰符
可选参数
class Program
{
static void EnterLogData(string message,string owner="Programer")
{
Console.Beep();
Console.WriteLine("Error:{0}", message);
Console.WriteLine("Owner of Error:{0}", owner);
}
static void Main(string[] args)
{
//调用含可选参数的函数
EnterLogData("Oh no ! Grid can't find data ");
EnterLogData("Oh no ! I can't find the payroll data", "CFO");
Console.ReadKey();
}
}
在上面的两次调用中:
需要注意的是可选参数的值必须在编译时就确定好,而不能再运行时,才确定
命名参数
C#传递参数的更多相关文章
- Vue 给子组件传递参数
Vue 给子组件传递参数 首先看个例子吧 原文 html <div class="container" id="app"> <div clas ...
- [转] C++的引用传递、指针传递参数在java中的相应处理方法
原文出处:[http://blog.csdn.net/conowen/article/details/7420533] 首先要明白一点,java是没有指针这个概念的. 但是要实现C++的引用传递.指针 ...
- 记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)
目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: ProcessStartInfo psi = new ProcessStartInfo(); p ...
- 在 Angularjs 中 ui-sref 和 $state.go 如何传递参数
1 ui-sref.$state.go 的区别 ui-sref 一般使用在 <a>...</a>: <a ui-sref="message-list" ...
- Linux线程体传递参数的方法详解
传递参数的两种方法 线程函数只有一个参数的情况:直接定义一个变量通过应用传给线程函数. 例子 #include #include using namespace std; pthread_t thre ...
- 【hadoop】如何向map和reduce脚本传递参数,加载文件和目录
本文主要讲解三个问题: 1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数. 2 使用Streaming编写MapReduce程序(C/C++ ...
- python 函数传递参数的多种方法
python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...
- Apache AB 如何传递参数
AB使用时,网上通篇一律,在进行示例时使用的连接一般都是http://*.com,这种写法是没有带参数,如果你想测试一个写入的Case,那需要传递参数给后台,如何传递参数呢? 这里有一个登录的请求,需 ...
- js跳转传递参数
额,利用j获取了GridView中选中行数据后,通过JavaScript做跳转,传递参数的时候发现,当参数有中文的时候就会乱码, 当然出现这种情况的时候就需要对跳转的url进行编码 var urlX ...
- [ActionScript 3.0] 通过内联函数对addFrameScript方法传递参数
虽然说不推荐使用影片剪辑隐藏方法addFrameScript();但是解决某些问题,此方法的确会方便很多. 但是却不能直接传递参数,不过可以用迂回的方法,如下: mc.addFrameScript(m ...
随机推荐
- IOS开发之路四(UITabBarController)
前两天看了看斯坦福大学的iphone开发公开课,讲的倒是不错,可看的我云里雾里的,不怎么讲基础和原理,不太适合初学者.今天看了一上午ios5基础教程这本书感觉有点头绪了....废话少说,讲一讲我上午做 ...
- socat : Some useful commands
http://technostuff.blogspot.com/2008/10/some-useful-socat-commands.html MONDAY, OCTOBER 6, 2008 Some ...
- maven中解决javax.servlet.jsp.PageContext cannot be resolved to a type
在eclipse环境下用maven出现:javax.servlet.jsp.PageContext cannot be resolved to a type. 这是由于没有引入jsp-api引发的问题 ...
- Mysql中使用树的设计
原来一直使用id与 parent_id结合的办法设计树,最近发现有些问题: 1.查询此结点下所有子结点的需求. 2.查询此结点上所有父结点的需求. 这些需求在oracle和sql server中可以使 ...
- 58 web框架Argo代码分析
贴地址:https://github.com/58code/Argo 核心jar javax.servlet-api 3.0.1 guice 3.0 velocity 1.7 框架使用 servlet ...
- 你真的会使用SQL Server的备份还原功能吗?之一:恢复模型
在SQL Server中,除了系统数据库外,你创建的每一个数据库都有三种可供选择的恢复模型: Simple(简单), full(完整), bulk-logged(批量日志). 下面这条语句可以显示出所 ...
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<= ...
- 琐碎-关于Windows调试hadoop
http://www.aboutyun.com/thread-7784-1-1.html 今天早上看了这个文章后我有点疑问,所以特地实践了一把. 之前也遇到了调试的时候 org.apache.hado ...
- 多线程和并发管理 .NET多线程服务
线程相关静态变量 默认静态变量应用程序域所有线程可见.如果静态变量需要在线程间共享,同步访问也就必然了. 线程相关静态变量保证线程安全,同一时间只有一个线程可访问,且每个线程都有该静态变量的拷贝. p ...
- Burn the Linked Camp(bellman 差分约束系统)
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...