`

C#引用参数和输出参数的区别

    博客分类:
  • C#
 
阅读更多


ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。

  使用ref前必须对变量赋值,out不用。

  out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。


从CLR的角度看,关键字out和关键字ref是等效的,这就是说,无论使用哪个关键字,都会生成相同的元数据和IL代码。但是,C#编译器将两个关键字区别对待,在C#中,这两个关键字的区别在于哪个方法负责初始化引用对象。如果方法的参数标记为out,那么调用者不希望在调用方法之前初始化对象,被调用的方法不能读取对象的值,而且被调用的方法必须在返回之前为对象赋值。如果方法的参数标记为ref,那么调用者必须在调用方法之前首先初始化参数的值,被调用的方法可以读取参数或为参数赋值。


----cite a simple example
using System;
class TestApp
{
 static void outTest(out int x, out int y)
 {//离开这个函数前,必须对x和y赋值,否则会报错。 
  //y = x; 
  //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行 
  x = 1;
  y = 2;
 }
 static void refTest(ref int x, ref int y)
 { 
  x = 1;
  y = x;
 }
 public static void Main()
 {
  //out test
  int a,b;
  //out使用前,变量可以不赋值
  outTest(out a, out b);
  Console.WriteLine("a={0};b={1}",a,b);
  int c=11,d=22;
  outTest(out c, out d);
  Console.WriteLine("c={0};d={1}",c,d);

  //ref test
  int m,n;
  //refTest(ref m, ref n); 
  //上面这行会出错,ref使用前,变量必须赋值

  int o=11,p=22;
  refTest(ref o, ref p);
  Console.WriteLine("o={0};p={1}",o,p);
 }
}

namespace 方法参数
{
    /// <summary>
    /// 参数测试
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //输出参数
            Point p = new Point(10, 12);
            int x, y;//输出参数不需要赋初值//与引用类型相似,输出参数也不开辟新的内存区域, 
但在调用方法前无需对变量进行初始化。
            p.GetPoint(out x, out y);
            Console.WriteLine("p({0},{1})", x, y);
            //引用参数
            Point2 p1 = new Point2(12, 23);
            int x1 = 0, y1 = 0;//引用参数一定要赋初值
            p1.GetPoint(ref x1, ref y1);
            Console.WriteLine("p1({0},{1})", x1, y1);
            // 参数数组
            int[] a = { 1, 2, 3, 4, 5 };
            Array.F(a);
            Array.F(10, 20, 30, 60, 50);//F(new int[] {10, 20, 30, 60, 50})
            Array.F();
            Console.ReadLine();
        }
    }
    /// <summary>
    /// 输出参数可返回多个值
    /// </summary>
    class Point
    {
        int X, Y;
        public Point(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
        public void GetPoint(out int x, out int y)//输出参数用于传递方法返回的数据。out修饰符后应跟与形参类型相同的类型申明。在方法返回后,传递的变量被认为经过了初始化。
        {
            y = this.Y;
            x = this.X;
        }
    }
    /// <summary>
    /// 引用参数
    /// </summary>
    class Point2
    {
        int X, Y;
        public Point2(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
        public void GetPoint(ref int x, ref int y)
        {
            y = this.Y;
            x = this.X;
        }
    }
    /// <summary>
    /// 参数数组
    /// </summary>
    class Array
    {
        public static void F(params int[] args)
        {
            Console.WriteLine("数组长度为:{0}", args.Length);
            foreach (int i in args)
            {
                Console.WriteLine("{0}", i);
            }
            Console.WriteLine();
        }
    }
}


分享到:
评论

相关推荐

    C#中参数数组、引用参数和输出参数示例详解

    本文主要介绍了关于C#参数数组、引用参数和输出参数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 参数数组 在C#中,可以为函数指定一个不定长的参数,这个参数是函数定义中的最后一...

    C#方法参数例子

    C#方法参数的一个简单例子,具体用了值参数、引用型参数 、输出参数、数组型参数做例子,适合初学者。

    C#基础语法:方法参数详解

    主要介绍了C#基础语法:方法参数详解,本文讲解了值参数、引用参数、输出参数、参数数组等参数类型,并分别给出代码实例,需要的朋友可以参考下

    在一小时内学会 C#(txt版本)

    和 C++ 有所区别的是,C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件中。 看看 C# 中的 Hello World 程序。 复制内容到剪贴板 代码: using System; ...

    C#中按引用传递与按值传递的区别,以及ref与out关键字的用法详解

    代码如下:/给三个整数从小到大排序并求和...熟悉引用参数和输出参数的使用。using System;class Class1 { //x,y,z是形参,按值传递 static void Sort(int x, int y, int z) { int temp=0; if(x&gt;y) { temp=x; x

    Visual C# 2010程序设计教程(教程PPT+源代码)

    7.2.3 输出类型参数传递 7.2.4 数组类型参数传递 7.3 静态方法 7.4 方法的重载 7.5 外部方法 7.6 操作符重载 7.6.1 一元操作符的重载 7.6.2 二元操作符的重载 7.7 本章小结 7.8 上机练习 7.9 习题 第8章 继承与多态...

    C#本质论(第3版)

    4.5.3 输出参数 4.5.4 参数数组 4.6 递归 4.7 方法重载 4.8 可选参数 4.9 用异常实现基本错误处理 4.9.1 捕捉错误 4.9.2 使用throw语句报告错误 4.10 小结 第5章 类 5.1 类的定义和实例化 5.2 实例字段 ...

    C#百例(100个个例,教你学会C#)

    12、该程序显示了各种值参数、引用参数和输出参数的初始化和调用结果比较。 13、该程序显示了c#中指针的用法, 14、该程序显示了打开文件并写入文字,若该文件不存在,就显示该完全路线。 15、该程序是一个输入姓名...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    4.5.2 引用参数(ref) 117 4.5.3 输出参数(out) 118 4.5.4 参数数组 120 4.6 递归 122 4.7 方法重载 124 4.8 可选参数 126 4.9 用异常实现基本错误处理 129 4.9.1 捕捉错误 130 4.9.2...

    如何用C#动态编译、执行代码

    提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。 CreateCompiler():获取编译器的实例。 二、ICodeCompiler 定义用于调用源代码编译的接口或使用指定编译器的CodeDOM...

    轻松学C#(图解版)

    4.4.3 输出参数(out参数) 61 4.5 特殊的方法 62 4.5.1 Main()方法 62 4.5.2 构造函数 62 4.5.3 带参数的构造函数 63 4.5.4 析构函数 64 4.6 小结 65 4.7 习题 65 第5章 流程控制 69 5.1 选择执行——条件 70 ...

    C# 基础学习案例源码-2023(32套源码案例)适合初学者学习使用

    CS_02输入和输出 CS_03异常捕获 CS_04字符串拼装 CS_05枚举 CS_06数组 CS_07二维数组 CS_08交错数组 CS_09值类型和引用类型 CS_10特殊的引用类型string CS_11函数 CS_12学习ref和out CS_13变长参数和参数默认值 CS_...

    c#学习笔记.txt

    在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对调用其方法的对象的引用。与 C 函数指针...

    C#微软培训资料

    11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 结.137 第十二章 域 和 属 性 .139 12.1 域 .139 12.2 属 性 .143 12.3 小 结 .146 第十三...

    微软C#语言规范,C#语言教程中文版

    1.3 类型和变量 3 1.4 表达式 6 1.5 语句 8 1.6 类和对象 12 1.6.1 成员 12 1.6.2 可访问性 13 1.6.3 类型参数 13 1.6.4 基类 14 1.6.5 字段 14 1.6.6 方法 15 1.6.6.1 参数 15 1.6.6.2 方法体和局部变量 17 1.6.6.3...

    C#中ref和out参数使用时需要注意的问题

    ref  通常我们向方法中传递的是值。方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被...当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我

    明日科技C#开发入门及项目实战

    实例011 使用值类型和引用类型输出不同的字段 实例012 判断当前系统日期是星期几 实例013 定义局部变量输出不同的字段 实例014 定义循环内部变量并输出变量的值 实例015 定义常量计算圆的周长 实例016 使用“+”编写...

    C#教程(语言规范)

    2.4.5 运算符和标点符号... 42 2.5 预处理指令 42 2.5.1 条件编译符号... 43 2.5.2 预处理表达式... 43 2.5.3 声明指令... 44 2.5.4 条件编译指令... 45 2.5.5 诊断指令... 47 2.5.6 区域指令... 47 2.5.7 ...

Global site tag (gtag.js) - Google Analytics