与函数交换数据的最好方式就是传递参数,在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. Oracle 触发器在日志管理开发中的应用

    摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...

  2. VPW Communication Protocol

    http://www.fastfieros.com/tech/vpw_communication_protocol.htm Breakdown of the j1850 3 byte Header f ...

  3. MySQL主从读写分离专题

    主机A:192.168.1.101从机B:192.168.1.102 1.先登录主机 Amysql>GRANT REPLICATION SLAVE ON *.* TO slave_user@19 ...

  4. cdoj 04 Complete Building the Houses 暴力

    Complete Building the Houses Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/# ...

  5. [转]O(n)回文子串算法 Manacher算法

    这里,我介绍一下O(n)回文串处理的一种方法.Manacher算法.原文地址:http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear- ...

  6. osg轮廓特效 【转】

    // -*-c++-*- /* * OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield * * This library is open s ...

  7. MySQL Spatial Extensions 地理信息

    http://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html http://mysqlserverteam.com/mysql-5-7-an ...

  8. C#开源类库

    PDFsharp PDFsharp是一款可以让.NET框架支持的任何语言很容易的创建PDF文件的类库. ASP.NET FO PDF FO PDF 是一款C#编写类似于ASP.NET服务器控件的控件. ...

  9. 计划任务命令crontab、at

    一.为计划任务提供支持 开始为系统建立计划任务之前,需要为系统添加相关设置,以确保计划任务能够正确运行.计划任务需要的支持主要包括两个方面:正确运行系统服务.准确的系统时间. 1.正确运行系统服务 为 ...

  10. No Entertainment!

    今天决定去打印一个“No Entertainment”的横幅,贴在电脑的旁边.这其实是很久以前的事了,却搁浅到了现在.也正因为如此,今天想起来也觉得格外刻不容缓,内心好似义愤填膺,便写下这愤慨的独白. ...