与函数交换数据的最好方式就是传递参数,在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();
}
}

在上面的两次调用中:

第一次调用中,没有显式指定第二个string的值,第二个参数采用默认值即"Programer"
第二次调用中,显式指定了owner的值为"CFO"

需要注意的是可选参数的值必须在编译时就确定好,而不能再运行时,才确定

命名参数


C#传递参数的更多相关文章

  1. Vue 给子组件传递参数

    Vue 给子组件传递参数 首先看个例子吧 原文 html <div class="container" id="app"> <div clas ...

  2. [转] C++的引用传递、指针传递参数在java中的相应处理方法

    原文出处:[http://blog.csdn.net/conowen/article/details/7420533] 首先要明白一点,java是没有指针这个概念的. 但是要实现C++的引用传递.指针 ...

  3. 记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)

    目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: ProcessStartInfo psi = new ProcessStartInfo(); p ...

  4. 在 Angularjs 中 ui-sref 和 $state.go 如何传递参数

    1 ui-sref.$state.go 的区别 ui-sref 一般使用在 <a>...</a>: <a ui-sref="message-list" ...

  5. Linux线程体传递参数的方法详解

    传递参数的两种方法 线程函数只有一个参数的情况:直接定义一个变量通过应用传给线程函数. 例子 #include #include using namespace std; pthread_t thre ...

  6. 【hadoop】如何向map和reduce脚本传递参数,加载文件和目录

    本文主要讲解三个问题:       1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数.       2 使用Streaming编写MapReduce程序(C/C++ ...

  7. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  8. Apache AB 如何传递参数

    AB使用时,网上通篇一律,在进行示例时使用的连接一般都是http://*.com,这种写法是没有带参数,如果你想测试一个写入的Case,那需要传递参数给后台,如何传递参数呢? 这里有一个登录的请求,需 ...

  9. js跳转传递参数

    额,利用j获取了GridView中选中行数据后,通过JavaScript做跳转,传递参数的时候发现,当参数有中文的时候就会乱码, 当然出现这种情况的时候就需要对跳转的url进行编码 var urlX ...

  10. [ActionScript 3.0] 通过内联函数对addFrameScript方法传递参数

    虽然说不推荐使用影片剪辑隐藏方法addFrameScript();但是解决某些问题,此方法的确会方便很多. 但是却不能直接传递参数,不过可以用迂回的方法,如下: mc.addFrameScript(m ...

随机推荐

  1. 分布式文件系统HDFS体系

    系列文件列表: http://os.51cto.com/art/201306/399379.htm 1.介绍 hadoop文件系统(HDFS)是一个运行在普通的硬件之上的分布式文件系统,它和现有的分布 ...

  2. JSON的解析

    一:JSON字符串转换为JSON对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 JavaScript ...

  3. 【转】Python实现的线程池

    import Queue, threading, sys from threading import Thread import time,urllib # working thread class ...

  4. CodeForces 163A Substring and Subsequence dp

    A. Substring and Subsequence 题目连接: http://codeforces.com/contest/163/problem/A Description One day P ...

  5. iOS开发——多线程OC篇&(十)多线程NSOperation基本使用

    NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最⼤大并发数的 ...

  6. this class is not key value coding-compliant for the key XXX错误的解决方法

    转自:http://www.cnblogs.com/zhangronghua/archive/2012/03/16/iOSError1.html 今天在听iOS开发讲座时,照着讲座的demo输入代码, ...

  7. nopCommerce 数据缓存

    为了提高一个系统或网站的性能和IO吞吐量,我们一般都会采用缓存技术.当然NopCommerce也不例外,本文我们就来给大家分析一下nop中Cache缓存相关类设计.核心源码及实现原理. 一.Nop.C ...

  8. linxu,window系统

    window下:net start VMwareHostdVMAuthdServiceVMUSBArbService"VMware NAT Service"VMnetDHCP #启 ...

  9. nginx多进程模型之配置热加载---转

    http://blog.csdn.net/brainkick/article/details/7176405 前言: 服务器程序通常都会通过相应的配置文件来控制服务器的工作.很多情况下,配置文件会经常 ...

  10. 倒数计数器-CountDownLatch

    最近写一个多线程程序,老是MAIN方法执行完了子线程还没执行完(不知道以前怎么玩儿的),得不到最终结果,于是找到了CountDownLatch CountDownLatch是一个同步辅助类,java. ...