C#学习笔记_关键字ref、out

函数传递参数

在C#中函数传递的参数,函数内有操作改变其值,并不会改变函数外参数对应变量的值,可见如下实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace code
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            Console.WriteLine("函数外:" + a);
            add(a);
            Console.WriteLine("函数外:" + a);
            Console.ReadKey();

        }

        static void add(int a)
        {
            Console.WriteLine("函数内:" + a);
            a += 10;
            Console.WriteLine("函数内:" + a);
            return;
        }
    }
}

输出结果:

函数外:10
函数内:10
函数内:20
函数外:10

可见,实际函数内对a进行+10操作后,函数外再输出a值,并没有发生变化。由此,成功印证函数内操作不会影响函数外变量值的结论。

关键字ref

一、作用

将变量本身传入函数,使函数内对变量的操作可以影响函数外变量值。

注意,此时变量在函数外必须赋值。

二、语法

在声明函数与使用函数时,均需要在形参与实参前加上ref关键字。

上面的实例修改后如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace code
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            Console.WriteLine("函数外:" + a);
            add(ref a);    //添加ref关键字
            Console.WriteLine("函数外:" + a);
            Console.ReadKey();

        }

        static void add(ref int a)    //添加ref关键字
        {
            Console.WriteLine("函数内:" + a);
            a += 10;
            Console.WriteLine("函数内:" + a);
            return;
        }
    }
}

此时程序输出结果:

函数外:10
函数内:10
函数内:20
函数外:20

可见,在修改后的本实例中,函数内对a的修改操作影响了函数外变量a的值。

三、分析

调用函数时传递参数,是将变量值传递到栈空间中;而使用了ref关键字,则是将变量的地址值传递到栈空间,即“引用传递”。函数通过地址获得变量实际存储位置,直接对变量进行操作,从而实现函数内操作影响函数外变量值。

关键字out

一、作用

当希望函数返回多个不同类型返回值时,通过out关键字可以实现。

注意,相关变量函数外可以不赋值,但函数内必须赋值。

二、语法

在声明函数与使用函数时,均需要在形参与实参前加上out关键字。

例如,希望获得两个int型数据的最大值、最小值、和、商,其中商需要为double型数据。以下实例可实现该功能:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace code
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10, b = 3;
            int _max, _min, _sum;
            double _quo;
            func(a, b, out _max, out _min, out _sum, out _quo);
            Console.WriteLine("max={0} min={1} sum={2} quo={3}", _max, _min, _sum, _quo);
            Console.ReadKey();
        }

        static void func(int a,int b,out int _max,out int _min,out int _sum,out double _quo)
        {
            _max = (a >= b) ? a : b;
            _min = (a < b) ? a : b;
            _sum = a + b;
            _quo = (double)(a / (double)(b));
            return;
        }
    }
}

输出结果如下:

max=10 min=3 sum=13 quo=3.33333333333333

在Main函数中,实际并没有对几个下划线为起始的变量名赋值,但最后输出时,几个变量都输出了通过函数func获得的对应值。可见,函数通过out关键字,以类似的形式传递了多个返回值。

相关推荐

  1. C#学习笔记_关键字ref、out

    2024-01-29 23:16:02       54 阅读
  2. C++ 学习系列 -- using关键字

    2024-01-29 23:16:02       56 阅读
  3. Elixir学习笔记——关键字列表和映射

    2024-01-29 23:16:02       35 阅读
  4. 新人学习笔记之(注释和关键字

    2024-01-29 23:16:02       34 阅读
  5. C++关键字

    2024-01-29 23:16:02       26 阅读
  6. c++模板学习笔记

    2024-01-29 23:16:02       48 阅读
  7. C++学习笔记(十)

    2024-01-29 23:16:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-29 23:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-29 23:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-29 23:16:02       82 阅读
  4. Python语言-面向对象

    2024-01-29 23:16:02       91 阅读

热门阅读

  1. leetCode 第十五天

    2024-01-29 23:16:02       55 阅读
  2. 聊聊 FTP、SFTP、FTPS

    2024-01-29 23:16:02       56 阅读
  3. 个人关于背包问题的·总结(三)

    2024-01-29 23:16:02       50 阅读
  4. git修改用户名与邮箱

    2024-01-29 23:16:02       64 阅读
  5. MySQL数据库免费客户端简介

    2024-01-29 23:16:02       55 阅读
  6. LeetCode 53 最大子数组和

    2024-01-29 23:16:02       57 阅读
  7. 实用SQL语句(postgres)

    2024-01-29 23:16:02       55 阅读
  8. L1-016 查验身份证

    2024-01-29 23:16:02       62 阅读