c#中的ref、out、params参数
out参数
与c++的引用的对比
out参数可以用来传递方法返回值,与c++中的引用有点像,但是还有有些不同:
- 调用方法的时候必须写out参数
- 调用方法之前必须先分配空间
- 调用方法之前不用先赋值.
- 必须在方法内部对out参数赋值;
下面自己实现一个tryparse函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace out参数
{
class Program
{
public struct Mid
{
public int[] _num;
public string _name;
}
static void Main(string[] args)
{
//写一个方法,求一个数组中的最大值、最小值、总和、平均值。
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//将要返回的四个值,放到一个数组里返回;但是问题是数组是一组相同类型的数据,所以才能放到一个数组里面。
//如果不同类型的话,只能从参数返回了.这时候又可以用结构封装起来返回;但是这个结构不一定是有意义的,同时是需要做后续操作的.
// Mid mid = GetMaxMinSumAvg(numbers);
// Console.WriteLine("名字是{0}",mid._name);
int max, min, sum;
double avg;
GetTest(numbers, out max, out min, out sum,out avg);
Console.WriteLine("最大值是{0},最小值是{1},总和为{2},平均值为{3}",max,min,sum,avg);
Console.ReadKey();
}
/// <summary>
/// 计算一个整数数组的最大值,最小值,平均值,总和,平均值;
/// </summary>
/// <param name="nums">需要计算的那个数组</param>
/// <param name="max">多余返回的最大值</param>
/// <param name="min">多余返回的最小值</param>
/// <param name="sum">对于返回的总和</param>
/// <param name="avg">多余返回的平均值</param>
public static void GetTest(int []nums,out int max,out int min,out int sum,out double avg)
{
//必须在方法内部对out参数赋值;
max = nums[0];
min = nums[0];
sum = nums[0];
for (int i = 1; i < nums.Length; i++)
{
if (nums[i]>max)
{
max = nums[i];
}
if (nums[i]<min)
{
min = nums[i];
}
sum += nums[i];
}
avg = sum * 0.1 / nums.Length;
}
/// <summary>
/// 自己实现一个int型的TryParse()函数;
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <returns></returns>
public static bool MyTryParse(string str,out int num)
{
try
{
num = int.Parse(str);
}
catch (OverflowException)
{
num = 0;
return false;
}
return true;
}
}
}
ref参数
ref就相当于c++中的引用;比out要更像一点,看它就像是reference的缩写;
注意三点:
- 在调用方法前一定要赋值;
- 调用时一定要写ref;
- 一定要构造空间
下面写一个交换两个变量内容的操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//ref就相当于c++中的引用;比out要更像一点,out专注返回20年;
namespace ref参数
{
class Program
{
static void Main(string[] args)
{
int n1 = 10;
int n2 = 20;
//注意两点;在调用方法前一定要赋值;一定要写ref;一定要构造空间
Exchange(ref n1, ref n2);
Console.WriteLine("交换后,第一个变量是{0},第二个参数是{1}",n1,n2);
Console.ReadKey();
}
/// <summary>
/// 交换两个变量
/// </summary>
/// <param name="n1">第一个变量</param>
/// <param name="n2">第二个变量</param>
public static void Exchange(ref int n1,ref int n2)
{
n1 = n1 - n2;
n2 = n1 + n2;
n1 = n2 - n1;
}
}
}
params参数
params是可变类型参数,但是它与c++中的变长参数又有不同:
- 将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。
- params可变参数必须是形参列表中的最后一个元素。
- 唯一性:在一个函数里,只能有一个params可变参数
- 调用时有两种传递方式:数组和直接数据传;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Params参数
{
class Program
{
static void Main(string[] args)
{
int [] a={1,2,3};
Test("呵呵",a);
}
public static void Test(string name,params int[] par)
{
}
}
}
/*
* param可变参数 可以没有
* 唯一性
* 最后性
* 两种传递方式
* 求任意长度数组的最大值;
*
*/
c#中的ref、out、params参数的更多相关文章
- axios中get请求的params参数中带数组的处理方法
axios中get请求的params参数中带数组时导致向后台传参失败报错:from origin 'http://localhost:8080' has been blocked by CORS po ...
- C# 中out,ref,params参数的使用
C#中有三个高级参数,分别是out,ref,params: 1.out参数 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型. ...
- C# 方法的out、ref、params参数
一.out参数实例 [实例]求一个数组中的最大值.最小值.总和.平均值 class Program { static void Main(string[] args) { //写一个方法 求一个数组中 ...
- C#中的ref与out参数(本文仅作为个人笔记)
假如一个方法的参数(形参)是引用类型,那么使用那个参数来进行的任何修改都会改变参数引用的数据.但这里的关键在于,虽然引用的数据发生了变化,但参数本生没有改变——它仍然引用的是一个对象.换句话说,虽然可 ...
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
https://www.cnblogs.com/nnngu/p/8300164.html
- c#.net中参数修饰符ref,out ,params解析
params ============================================================================================= ...
- 基于params,ref,out的参数问题详解
http://www.jb51.net/article/37967.htm 最近在写程序时遇到params,ref,out 参数问题.回头有自习看了看MSDN,才巩固了基础.现在和大家分享一下.par ...
- out参数,ref参数,params参数数组
params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参 ...
- .net 中 ref out params的区别
C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性.但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,param ...
随机推荐
- 使用spring + cxf +tomcat构建webservice
这里使用maven构建的项目. 首先,我们构建一个maven项目: 然后将pom.xml文件中的内容拷贝到新建项目的pon.xml文件中: <project xmlns="http:/ ...
- spring mvc 重新定向到一个新的Url
在写项目的时候要求根据请求的参数的不同重新将请求分发,在查阅了spring mvc的一些资料无果后(想使用拦截器去做)就没办法使用重定向的方式去写了 /** * 通过访问API的方式分发请求 * * ...
- 1. SQL Server服务器监控实现方法
对于服务器的监控,和对数据库的监控,很少有合二为一的工具,如果有的话,一般是付费软件,或者自行开发的工具.所以如果不想购买软件,也不想花精力去开发的话,可以结合一些免费/开源的工具.自定义脚本,来完成 ...
- 【Linux】Shell脚本编程(三)
流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真”: 退出条件:当CONDITIO ...
- 剑指Offer36 数字在排序数组中出现的次数
/************************************************************************* > File Name: 36_Number ...
- java学习系列(一)Java中的IO操作
Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入\输出操作,在Java中把不同的输入\输出源抽象为"流",通过流的方式允许Java程序使用相同的方式来访问不同的输 ...
- 移动开发Html 5前端性能优化指南
详细内容请点击 PC优化手段在Mobile侧同样适用在Mobile侧我们提出三秒种渲染完成首屏指标基于第二点,首屏加载3秒完成或使用Loading基于联通3G网络平均338KB/s(2.71Mb/s) ...
- JavaScript之表格过滤器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SERVER 2012 R2 core域环境下批量创建用户
Write by xiaoyang 转载请注明出处 步骤一:创建域 基本配置 1. 输入命令进入配置 2. 输入8进入网络配置 3. 选择要配置的网 ...
- iOS - OC & Xcode
一.入门 1.1 iOS模版介绍 1.2 简单工程项目 1.3 设置App启动的设备方向 1.4 Xcode界面介绍 1.5 快速查找文件 1.6 快速更改同名变量 1.7 将代码提取为方法 1.8 ...