首页 > 编程语言 >C#中的ref关键字

C#中的ref关键字

时间:2023-11-29 10:55:06浏览次数:23  
标签:val ShowDouble C# 关键字 int Main ref 函数

值参数(Value Parameters)

1、传递的是参数的值(数据的副本)而不是原始数据本身。

2、函数内部对值参数的修改不会影响到原始数据。

3、通常用于传递基本数据类型(如整数、浮点数、布尔值)或不可变对象(如字符串、元组)。

4、值参数的传递是一种传值调用(Call by Value)。

示例代码

    internal class Program
  {
       static void ShowDouble(int val)
      {
           val *= 2;
           Console.WriteLine($"ShowDouble函数中val的值为:{val}");
      }
       static void Main(string[] args)
      {
           int val = 6;
           Console.WriteLine($"Main函数中执行ShowDouble函数前val的值为:{val}");
           ShowDouble(val);
           Console.WriteLine($"Main函数中执行ShowDouble函数后val的值为:{val}");
      }
  }

运行结果,如下图所示:

image-20231030185024616

把val作为一个参数,调用ShowDouble()并不影响Main()中val的值

那么如何改变val的值呢?

可以使用一个含返回值的函数

代码如下所示:

    internal class Program
  {
       static int ShowDouble(int val)
      {
           val *= 2;
           Console.WriteLine($"ShowDouble函数中val的值为:{val}");
           return val;
      }
       static void Main(string[] args)
      {
           int val = 6;
           Console.WriteLine($"Main函数中执行ShowDouble函数前val的值为:{val}");
           val = ShowDouble(val);
           Console.WriteLine($"Main函数中执行ShowDouble函数后val的值为:{val}");
      }
  }

运行结果,如下所示:

image-20231030185402536

成功改变了参数的值,但是这种方式并不直观,且不能改变用作参数的多个变量的值(因为函数只有一个返回值),这时就可以通过引用来传递参数。

引用参数(Reference Parameters)

1、传递的是参数的引用(内存地址),直接操作原始数据。

2、函数内部对引用参数的修改会影响到原始数据。

3、通常用于传递可变对象(如列表、字典)或对象实例,以便在函数内部进行修改并在函数外部保持修改后的状态。

4、引用参数的传递是一种传址调用(Call by Reference)。

C#中使用ref关键字指定参数,代码如下所示:

    internal class Program
  {
       static void ShowDouble(ref int val)
      {
           val *= 2;
           Console.WriteLine($"ShowDouble函数中val的值为:{val}");        
      }
       static void Main(string[] args)
      {
           int val = 6;
           Console.WriteLine($"Main函数中执行ShowDouble函数前val的值为:{val}");
           ShowDouble(ref val);
           Console.WriteLine($"Main函数中执行ShowDouble函数后val的值为:{val}");
      }
  }

运行结果,如下图所示:

image-20231030190228869

要注意,不仅在函数的声明中要使用ref指定参数,如代码 static void ShowDouble(ref int val)所示,在函数的调用中,也要再次指定它,如代码 ShowDouble(ref val)所示。

使用ref的限制

1、函数可能会改变引用参数的值,所以必须在函数调用中要使用“非常量”变量

 const int val = 6;

这种写法,编译器会报错,如下图所示:

image-20231030191147516

2、必须使用初始化过的变量。C#不允许假定ref参数在使用它的函数中初始化。

  int val;
 ShowDouble(ref val);

这种写法,编译器也会报错,如下图所示:

image-20231030191535799

参考书籍

《C#入门经典(第7版)》——Benjamin Perkins、Jacob Vibe Hammer、Jon D. Reid

标签:val,ShowDouble,C#,关键字,int,Main,ref,函数
From: https://www.cnblogs.com/mingupupu/p/17864054.html

相关文章

  • Docker部署ArthasTunnel
    1、下载ArthasTunnel的安装包下载地址:下载  2、部署由于官方只提供了JAR包,如果你想通过Docker方式启动的话,可以自行打包Docker镜像,打包使用的Dockerfile脚本如下:#该镜像需要依赖的基础镜像FROMopenjdk:8-jdk-alpine#将当前目录下的jar包复制到docker容器的/目录下A......
  • socket测试
    echo_server#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#definePORT7406vo......
  • Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI -->
    Android之看“马达”如何贯通Android系统(从硬件设计-->驱动-->HAL-->JNI-->Framework-->Application)-如果天空不死-博客园https://www.cnblogs.com/skywang12345/p/3404808.html  在Android2.3(Gingerbread)系统的时候,我写过一篇关于“Android震动马达......
  • vue+iframe 添加请求头,自适应宽度和高度,iframe将token放在请求头不是src的url中
    1<template>2<divclass="iframe">3<iframe4v-if="isRequestHeader"5id="myIframe"6name="myIframe"7src=""8frameborder="0&qu......
  • Java lettuce 连接Redis哨兵波动问题的排查
    环境信息说明:本文内容基于公司内部出现的问题,已经对机器环境信息做了脱敏处理。hostnameIPaddressroleA10.0.0.190哨兵节点B10.0.0.191哨兵节点C10.0.0.192master节点D10.0.0.193slave节点E10.0.0.194slave节点F10.0.0.197哨兵节点......
  • centos一网打尽
    wget-i-chttp://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm#https://dev.mysql.com/downloads/yum-yinstallmysql80-community-release-el7-11.noarch.rpmyum-yinstallmysql-community-serversystemctlstartmysqld.servicesystemctlstat......
  • docker故障:driver failed programming external connectivity on endpoint
    故障现象Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointjenkins(ffdc7c9cda72c575d6b045574d1432b256603a3d986a05da319ab7f3af233755):(iptablesfailed:iptables--wait-tnat-ADOCKER-ptcp-d0/0--dport50000-jDN......
  • Docker + supervisor在同一容器中部署zookeeper和kafka
    使用supervisor进程管理工具,在同一个容器中部署zookeeper和kafka目录Dockerfilejdk1.8.0_181.tar.gzkafka_2.12-1.1.0.tgzconf.ddocker-compose.ymlkafka_conf.dconf.d中为supervisor配置文件kafka_conf.d中为kafka配置文件,解压kafka_2.12-1.1.0.tgz中的配置文件,拷贝......
  • 【HMS Core】帐号服务中登录图标字体如何改变
    ​ 【关键词】登录按钮、字体 【问题描述】APP需要分发到香港地区,登录按钮图标如何改成繁体字,文档里只有中英文。https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/dev-specifications-0000001050048916​ 【解决方案】这个按钮后面的文字部分是支持各......
  • 【HarmonyOS】Mac电脑打开DevEco Studio意外退出或双击图标没反应
    ​【关键字】Mac,DevEcoStudio  【问题背景】Mac电脑打开DevEcoStudio报意外退出,或者双击图标没反应​​ 【解决方案】删除Users/{USER_NAME}/Library/LaunchAgents/jetbrains.vmoptions.plist文件后重启Mac 【相关链接参考】https://developer.huawei.com/consu......