首页 > 编程语言 >C#引用类型带ref关键字的用处

C#引用类型带ref关键字的用处

时间:2023-05-30 10:11:26浏览次数:46  
标签:Console mc C# 关键字 引用 类型 ref id

1.在C#中有两个大的数据类型,值类型和引用类型。

1)任何的结构体(例如:struct Int32...)或者是枚举都是值类型。

2)能被称作"类"的,则为引用类型,比如你用如下关键字(class、interface、delegate、record),或者是使用C#内置的引用类型:dynamic、object、string。

引用类型和值类型。 引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。 对于引用类型,两种变量可引用同一对象;因此,对一个变量执行的操作会影响另一个变量所引用的对象。 对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量(inref 和 out 参数变量除外)-------- 引用类型 - C# 参考 | Microsoft Learn

 3)值类型放在栈上的,而引用类型是放在堆上的(new过之后),栈上只保留一个指向该引用类型的指针。

2.值类型方法形参的传递

1)对于值类型,传递的是该值的一个副本,在方法内部改变该值,对原有的值没有影响。如下例-> p最终打印出来还是1;

 1 static void Main(string[] args)
 2 {
 3       int p = 1;
 4 
 5       Add(p);
 6 
 7       Console.WriteLine(p);
 8       Console.ReadLine();
 9 }
10 static void Add(int x) => x += 1;

2)如果需要p能被方法内部所修改,则可以加上ref关键字来传递,对于值类型ref关键字会把该变量的地址传入,也就是传递一个指向该值的指针。如下例->p最终打印出来的是2;

 1   static void Main(string[] args)
 2   {
 3         int p = 1;
 4   
 5         Add(ref p);
 6   
 7         Console.WriteLine(p);
 8         Console.ReadLine();
 9   }
10  static void Add(ref int x) => x += 1;

 

     3.引用类型方法形参的传递

1)对于引用类型,引用类型的变量存储的是一个指向该变量值的指针。所以不用加ref关键字,就可以做到方法内部修改了值,传入的值也会变(但是无法改变传入值原有的引用)。下面打印出来的就是1\n2

static void Main(string[] args)
{
        MyClass mc = new()
        {
            id = 1,
            Type = "a"
        };
        Console.WriteLine(mc.id);
        Change(mc);
        Console.WriteLine(mc.id);
        Console.ReadLine();
}

 static void Change(MyClass mc)
{
         mc.id = 2;
}

 2)引用类型加上ref关键字传递,调用方则可以改变引用类型参数的引用。对象的存储位置按引用参数的值传递到方法,更改参数存储位置中的值(指向新对象),还可以将存储位置更改为调用方所引用的位置。如下例1,在方法内部改变了参数的原有对象引用,但是输出结果还是1\n2。

 1 static void Main(string[] args)
 2 {
 3         MyClass mc = new()
 4         {
 5             id = 1,
 6             Type = "a"
 7         };
 8         Console.WriteLine(mc.id);
 9         Change(mc);
10         Console.WriteLine(mc.id);
11         Console.ReadLine();
12 }
13 
14  static void Change(MyClass mc)
15 {
16          mc.id = 2;
17          mc = new()
18         {
19             id = 3,
20             Type = "c"
21         };
22 }

            如果加上ref传递,如下例2:最终打印的结果就是1\n3

 1   static void Main(string[] args)
 2   {
 3           MyClass mc = new()
 4           {
 5               id = 1,
 6               Type = "a"
 7           };
 8           Console.WriteLine(mc.id);
 9           Change(ref mc);
10          Console.WriteLine(mc.id);
11          Console.ReadLine();
12  }
13  
14   static void Change(ref MyClass mc)
15  {
16           mc.id = 2;
17           mc = new()
18          {
19              id = 3,
20              Type = "c"
21          };
22  }

总的来说如果参数是引用类型变量,内部可以操作该变量指向的内存的值(比如修改某个属性的值)但是无法修改该引用类型的原有对象引用(传递的),加上ref的传递则是把参数的指针传递了过来所以可以修改原对象引用。

eg:如果是方法的参数是引用类型,相当是有一个新的指针指向了该值内存空间。加上ref传递则是把原有的指针给传递了过来。

标签:Console,mc,C#,关键字,引用,类型,ref,id
From: https://www.cnblogs.com/AnYanaha/p/17442259.html

相关文章

  • 基于SCCM Baseline修正Lenovo高通X55 WWAN过度记录导致C盘空间被占满的问题
    背景近期有大量使用LenovoThinkPad系列的计算机C盘磁盘空间被占满。经过分析发现:位于%ProgramData%\Qualcomm®Snapdragon™X555GModem\SVClog下的日志文件占用了大量磁盘空间。本文为微风原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址。原因分......
  • MagickImage 压缩图片,JPEG2000压缩方式
    1、nuget引用通过命令或者界面引用MagickImage包2、压缩图片采用JPEG2000压缩方式,压缩质量因子Quality可以根据自己需要调节publicstaticvoidJPEG2000Compression(){varinputFilePath=@"C:\Users\Administrator\Desktop\input.tif";......
  • Excel原位填充快速下拉填充序列至1000行
    使用原位填充ctrl+enter1.在A1单元格中输入12.选中A2单元格,在上方名称框中填入A2:A1000,回车,此时即选中了A2:A10003.在编辑栏中填入=A1+1,按ctrl+enter,即可得到递增数据1,2,3,4,…10004.也可在编辑栏中填入=row(),按ctrl+enter*,得到递增数据1,2,3,4,…1000参考:https://blog.csd......
  • ChatGPT浅析
    ChatGPT是近期最火的概念了,和之前的AlphaGo不同,GPT让AI和普通大众如此接近,让大家可以亲自接触到AI带来的全新体验。不过,AI并不是魔法,ChatGPT也不是革命性的新技术。目前我个人来看,ChatGPT要取代人类的工作还言之过早,不过,辅助人类提高工作效率却已经绰绰有余。ChatGPT如此热门,相......
  • 检测CPU,内存,磁盘使用率shell
    检测CPU,内存,磁盘使用率shell 1.检测CPU,内存,磁盘使用率超过80%,则发送邮件告警#!/bin/bash#当前主机ipHOST=$(ipashoweth0|grep'\inet\b'|awk'{print$2}'|sed's/\/.*//')#告警邮箱[email protected]#磁盘使用百分比阈值DISK_USAGE_THRESHOLD=80#CPU......
  • Focus On 3D Terrain Programming三维地形渲染-Trent Polack-2003
    前言:你有多少次访问过你最喜欢的编程论坛或邮件列表,并对大量关于地形渲染算法的帖子感到惊讶,这些帖子似乎从各个角度向你袭来?地形渲染似乎是当今业余程序员最喜欢的主题;它是一个很好的门户网站,可以了解更高要求的问题及其解决方案。然而,地形渲染决不是一个简单的问题,特定的解决方......
  • 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
    百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统预测部署简介与总览百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统PaddleInference模型推理(离线部署)百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统基于PaddleServing快速使用(服务化部署)1.预测部署简介......
  • 前端开发如何更好的避免样式冲突?级联层(CSS@layer)
    作者:vivo互联网前端团队-ZhangJiqi本文主要讲述了CSS中的级联层(CSS@layer),讨论了级联以及级联层的创建、嵌套、排序和浏览器支持情况。级联层可以用于避免样式冲突,提高代码可读性和可维护性。一、什么是级联层(CascadeLayers)?1.1级联层的官方定义我们参看Cascadingand......
  • 2023-05-30 前端h5页面如何实现调起微信支付功能(该回答来自chatgpt,实际效果未测试)
    前端H5页面调起微信支付功能需要结合微信JS-SDK和后端接口实现。以下是基本步骤和示例代码:1.获取微信公众号的appid和secret在微信公众平台上创建一个公众号,获取其对应的appid和secret。2.引入微信JS-SDK将微信JS-SDK的链接放入HTML文件的头部,例如:<scriptsrc="https://res.......
  • 某种程度上亚马逊 OpenSearch 成功了
    导读据悉,某种程度上亚马逊OpenSearch成功了某种程度上亚马逊OpenSearch成功了2021年,开发Elasticsearch和Kibana的Elastic公司宣布更改许可证,此举旨在禁止云服务商如AWS使用它的软件作为一种服务提供给客户,但这也意味着这两个软件不再是开源软件。发生此事......