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 ...
随机推荐
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
/* * POJ_1159.cpp * * Created on: 2013年10月29日 * Author: Administrator */ #include <iostream> # ...
- 保持长宽比 对背景图像进行修改android:scaleType="fitXY"
关于android中ImageView的外观,即图片在其内显示出的样子,与布局文件中adjustViewBonds和scaleType属性的关系.我进行了一些探索.现跟大家共享,欢迎各位指教.分别将a ...
- 从命令行运行django数据库操作
从命令行运行django数据库操作,报错: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_T ...
- Linux五种IO模型
http://www.cnblogs.com/renxs/p/3683189.html
- XCode4中的文本查找和文本替换功能
转自:http://blog.csdn.net/zhuzhihai1988/article/details/7843186 1.如果是在打开的文档范围内: 查找: Command+ F ...
- 深入解析ext2文件系统之mke2fs
上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式.我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来.这篇博文主要讲述如何 ...
- SimpleDateFormat使用详解及与毫秒的相互转换
1. SimpleDateFormat使用详解 public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方 ...
- 标准库 - fmt/scan.go 解读
// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...
- matplotlib作图中文显示问题
def set_ch(): from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcPa ...
- tachyon 命令行接口
Usage: tachyon COMMAND where COMMAND is one of: format [-s] 格式化Format Tachyon (如果指定 -s 参数,表示在 underf ...