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 ...
随机推荐
- 【Android 界面效果25】android中include标签的使用
在一个项目中我们可能会需要用到相同的布局设计,如果都写在一个xml文件中,代码显得很冗余,并且可读性也很差,所以我们可以把相同布局的代码单独写成一个模块,然后用到的时候可以通过<include ...
- uva 101 POJ 1208 The Blocks Problem 木块问题 vector模拟
挺水的模拟题,刚开始题目看错了,poj竟然过了...无奈.uva果断wa了 搞清题目意思后改了一下,过了uva. 题目要求模拟木块移动: 有n(0<n<25)快block,有5种操作: m ...
- [原创] Web UI 自动化日期控件的处理
序 在构建自动化套件的过程中,日期操作是一件很重要也很频繁的事情.有的日期控件的div层级结构复杂,同一个类型的日期控件在多个子系统中的表现形式也大相径庭.多数工程师为了避免重复的工作,会封装抽象一个 ...
- 不停服务情况下升级nginx
第三方支付平台因安全问题对nginx做了升级操作,为了不影响业务,整个操作过程都不能停服务,因此对升级方法做出了要求.以下为我整理的生产环境实际操作方法,已在第三方支付平台上成功应用,希望对即将或者可 ...
- 使用jsoup进行网页内容抓取
对网页内容的抓取比较的感兴趣,于是就简单的学习了一下,如果不使用任何的框架去抓取网页的内容,感觉有点难度,我就简单点来吧,这里所使用的jsoup框架,抓取网页的内容与使用jquery选择网页的内容差不 ...
- IIs站点的建立
控制面板——管理工具——Internet信息服务管理器 首先应设置的文件权限:System 和 admin 程序池:4.0 编辑权限:iis apppool\名称 身份验证:匿名身份——应用程序池标识
- 京东2017 C++一面
一面直接跪,日 1. 重写和重载的区别 答的一般 2. C++内存分配方式 不会 3. TCP ...
- JQuery Validate验证显示错误提示位置
验证多个Name值相同的元素: $(".send").click(function () { var a = 0; var b = 0; var c = 0; var d = 0; ...
- Linq To Csv 实例简说
http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library 详细源代码在这里 https://github.com/mperdeck/L ...
- 使用ambari搭建Hadoop平台
1.操作系统 CentoOS Server with GUI(有GUI,有浏览器*ambari基于浏览器*推荐latest stable version)2.分区 默认 + /hadoop3.网络设置 ...