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可变参数 可以没有
 * 唯一性
 * 最后性
 * 两种传递方式
 * 求任意长度数组的最大值;
 *
 */
时间: 2024-10-11 11:06:55

c#中的ref、out、params参数的相关文章

C# 中out,ref,params参数的使用

C#中有三个高级参数,分别是out,ref,params: 1.out参数 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型. 在使用out参数的时候需要注意: 在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,赋值也会在方法中被覆盖掉. 方法使用了out参数传递变量时,就是要返回值,所以必须在方法内为其赋值. 方法的参数使用out关键字修饰时,在调用该方法时,也要在out参数传递的变量前面加上out关键字才

C# 方法的out、ref、params参数

一.out参数实例 [实例]求一个数组中的最大值.最小值.总和.平均值 class Program { static void Main(string[] args) { //写一个方法 求一个数组中的最大值.最小值.总和.平均值 int[] nums = { 1, 2, 3, 4, 5, 6 ,7}; int max; int sum; int min; int avg; bool b; string s; double d; GetValue(nums, out max, out min,

out参数,ref参数,params参数数组

params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参数,并且一个方法只能有一个params修饰的参数. 示例 public class MyClass { public static void UseParams(params int[] list) { for (int i = 0; i < list.Length; i++) { Console.

C# 中的三个高级参数 ref

今天在浏览博文时,看到这篇文章:C#中的ref 传进出的到底是什么 ? 在传对象时使用ref的疑问 引用类型就传的就是地址,值类型传的就是值,可是还仍有那么多人迷惑,网上虽然流传着很多ref 的相关文章,似乎都没为大伙解下惑. 最近有人在看我 CYQ.Data 框架 的时候说起,既然class是引用地址,本身传的就是地址,你代码中还要写ref传递来干什么; 贴出来做示例: /// <summary>    /// by 路过秋天 http://cyq1162.cnblogs.com    //

C#中关键字ref与out的区别(转)

在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out). 有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指

C#中的ref和out的区别

转载原地址 http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量.它们的区别是: 1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化.

params参数的调用

namespace params参数的用法 { class Program { public static void Test(string name,params int[] score) { int sum = 0; for (int i = 0; i < score.Length; i++) { sum += score[i]; } Console.WriteLine("{0}这次的总成绩为{1}",name,sum); } static void Main(string[

javascript中获取标准URL的参数

/** * 获取标准URL的参数 * @_key:字符串,不支持数组参数(多个相同的key) * @_url:字符串,(window).location.href,使用时别误传入非window对象 * @_spliter:字符串,参数间分隔符 * 注意: * 1.如不存在指定键,返回空字符串,方便直接显示,使用时注意判断 * 2.非标准URL勿用 * 3.query(?)与hash(#)中存在键值一样时,以数组返回 */ function getUrlParams(_key, _url, _sp

[C#]浅析ref、out参数

按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事,再把值类型和引用类型给参杂进来的话就变得更加让人头晕了.经常看到有人把按引用传递和引用类型混为一谈,让我有点不吐不快.再加上前两天碰到的一个有意思的问题,让我更加觉得应该整理整理关于ref和out的内容了. 一.什么是按引用传递 ref和out用起来还是非常简单的,就是在普通的按值传递的参数前加个ref或者out就行,方法定义和调用的时候都得加.ref和out都是表示按引用传递,CLR也完全不区分r