与函数交换数据的最好方式就是传递参数,在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. ThinkSNS插件的使用方法

    1.插件包放到/addons/plugin/ 目录下. 2.自定义一个插件钩子:修改/apps/public/Tpl/default/Index/index.html,约在65行左右,添加下面钩子.{ ...

  2. PowerShell管理Exchange

    #添加Exchange管理单元get-pssnapin -registeredadd-pssnapin microsoft.exchange* #启用邮箱账号(需要域管理员权限,因为需要将某些属性写入 ...

  3. Java练习之最大相同子串

    package string.demo; /* 需求:找到两个字符串的最长共同子串 * 思路: * 1.先看短的那个字符串是否在长的那个字符串中,如果存在,短的那个字符串就是最大共同子串 * 2.如果 ...

  4. Codeforces Round #342 (Div. 2) B. War of the Corporations 贪心

    B. War of the Corporations 题目连接: http://www.codeforces.com/contest/625/problem/B Description A long ...

  5. Looksery Cup 2015 H. Degenerate Matrix 数学

    H. Degenerate Matrix Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/549/ ...

  6. maven项目编译漏掉src/main/java下的xml配置文件

    在整合Spring + Mybatis框架的时候,自动扫描配置都已经配置好了. 配置如下: <?xml version="1.0" encoding="UTF-8& ...

  7. linux C 执行多个文件

  8. percona-xtrabackup 文档

    https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

  9. springMVC与struts2的区别

    1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能:spring会稍微比struts快.spring mvc是基于方法的设 ...

  10. 终端I/O之综述

    终端I/O有两种不同的工作模式: 规范模式输入处理(Canonical mode input processing).在这种模式中,终端输入以行为单位进行处理.对于每个读要求,终端驱动程序最多返回一行 ...