C# 中 ref、out 和 in 关键字的用法是什么?

c# 中 ref、out 和 in 关键字的用法是什么?

在C#中,大多数方法可以具有零个或多个参数,这些参数定义了必须提供给方法的数据。调用方法的任何代码都必须将数据(称为参数)传递给该方法。方法将其输入声明为参数,并且它们由调用代码以参数的形式提供。

例如,考虑以下方法和随后的方法调用。

static void Greet(string greeting){   Console.WriteLine(greeting);}...Greet("Hello");

在上面的示例中,greeting是Greet()方法的参数,而”Hello”是传递给该方法的参数。

当调用一个方法并传递参数时,它们是按值传递的,这意味着在传递给方法时会创建一个值的副本。在方法内部对参数所做的任何更改都不会反映在原始变量上。

using System;int number = 8;Increase(number);Console.WriteLine(number); // prints 8static void Increase(int num){   num = num + 1;   Console.WriteLine(num); // prints 9}

当您传递引用类型变量(例如对象)时,C# 仍然按值复制引用,因为该变量保存的是引用,而不是实际的对象。因此,即使传递了引用变量的副本,它们也都引用了内存中的同一个对象。因此,方法内部的变量对对象所做的任何更改对于方法外部的变量都是可见的。

using System;var john = new User{   Name = "John",   Salary = 50000};Promote(john);Console.WriteLine(john.Salary); // prints 60000static void Promote(User u){   u.Salary += 10000;   Console.WriteLine(u.Salary); // prints 60000}

但是,如果您在方法内部更改变量的值本身,则该更改不会反映在方法外部,因为仅更改了副本,而不是实际对象。例如,我们可以在方法内部将参数赋值为null,而实际变量将保持不变。

using System;var john = new User{   Name = "John",   Salary = 50000};Promote(john);Console.WriteLine(john.Salary); // prints 50000static void Promote(User u){   u = null;}

C#允许使用三个不同的修饰符关键字来控制方法的参数。

ref修饰符

C#允许您使用ref修饰符通过引用传递参数。无论要传递的变量属于引用类型还是值类型,都不重要。参数和参数将引用相同的内存位置。

在下面的示例中,将参数u设置为null也将使john变量为null,从而引发空引用异常。

示例

using System;var john = new User{   Name = "John",   Salary = 50000};Promote(ref john);Console.WriteLine(john.Salary); // throws System.NullReferenceExceptionstatic void Promote(ref User u){   u = null;}

使用ref修饰符传递的参数必须在传递之前进行初始化。

out修饰符

它与ref修饰符类似,除了:

参数在进入函数之前不需要进行初始化

参数在从函数中出来之前必须进行初始化(赋值)

在下面的示例中,Hire函数通过out修饰符初始化了一个传递给它的新用户对象。请注意,在调用Hire方法时,变量john是即时声明的。

using System;Hire(out User john);Console.WriteLine(john.Salary); // prints 50000static void Hire(out User u){   u = new User{      Name = "John",      Salary = 50000   };}

ref修饰符一样,由out修饰符标记的变量通过引用传递。

通常是out > 变量用于从函数获取多个返回值,如下 –

using System;var john = new User{   Name = "John",   Salary = 50000};bool shouldPromote = Raise(john.Salary, out double hike);Console.WriteLine(shouldPromote); // TrueConsole.WriteLine($"Hike Amount = {hike}"); // prints 5000static bool Raise(int salary, out double hike){   hike = salary * 0.1;   return hike < 7000;}

in修饰符

它类似于refout参数,但不同的是接受in参数的方法不能修改该参数的值。如果尝试修改,C#编译器会生成编译时错误。

in参数可以避免将大型值类型的内存复制到参数变量中,同时防止对象被意外修改。这在将大型值类型传递给方法时非常有用。

var point = new Coord();Verify(point);static void Verify(in Coord c){   // error: Cannot assign to variable 'in Coord' because it is a readonly variable   c = new Coord();}struct Coord{   public int X;   public int Y;}

示例

 实时演示

using System;class Program{   static void Main(){      int number = 8;      Increase(number);      Console.WriteLine(number); // prints 8      var john = new User { Name = "John", Salary = 50000 };      Promote(john);      Console.WriteLine(john.Salary); // prints 60000      Leave(john);      Console.WriteLine(john.Salary); // prints 60000      LeaveByRef(ref john);      Console.WriteLine(john?.Salary); // prints nothing      User dave;      Hire(out dave);      Console.WriteLine(dave.Salary); // prints 50000   }   static void Increase(int num){      num = num + 1;      Console.WriteLine(num); // prints 9   }   static void Promote(User u){      u.Salary += 10000;      Console.WriteLine(u.Salary); // prints 60000   }   static void Leave(User u){      u = null;   }   static void LeaveByRef(ref User u){      u = null;   }   static void Hire(out User u){      u = new User{         Name = "John",         Salary = 50000      };     }}class User{   public string Name { get; set; }   public int Salary { get; set; }}

输出

9860000600006000050000

以上就是C# 中 ref、out 和 in 关键字的用法是什么?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1435560.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C# 接口类型
上一篇 2025年12月17日 11:15:05
如何实现C#中的推荐系统算法
下一篇 2025年12月17日 11:15:20

相关推荐

  • 视频号视频怎么挂商品?挂商品可以不用原创吗?

    随着短视频电商的快速发展,视频号已成为商家实现带货转化的重要渠道。熟练掌握在视频中挂载商品的方法,不仅有助于提升销售效率,还能有效将流量转化为实际收益。 一、如何在视频号视频中挂商品? 开通商品分享权限:首先需确认视频号已完成企业或个体工商户认证,并在视频号管理后台开启“商品”功能。个人账号则需完成…

    2026年8月31日
    000
  • 如何解决Yii2框架中使用Bootstrap的问题?使用Composer可以轻松搞定!

    可以通过以下地址学习Composer:学习地址 在使用yii2框架开发项目时,我遇到了一个常见但棘手的问题:如何高效地将bootstrap集成到项目中。bootstrap是一个非常流行的前端框架,它可以帮助我们快速构建响应式和美观的用户界面。然而,直接在yii2项目中手动集成bootstrap不仅繁…

    用户投稿 2026年8月31日
    100
  • ThinkPHP开发注意事项:防止CSRF攻击

    ThinkPHP是一款非常流行的PHP开发框架,它被广泛应用于各种项目中。然而,随着网络安全问题的日益突出,开发者们必须要特别注意在使用框架进行开发时,防范各种潜在的安全威胁,其中包括CRSF(Cross-site request forgery)攻击。CRSF攻击是一种利用用户在其他网站已经登录的…

    2026年8月31日
    100
  • 谷歌加速器游戏版费用说明_免费使用条件与功能介绍

    付费加速器提供更优线路与稳定连接,免费版多有限制且存安全风险,建议根据需求选择正规渠道产品并关注用户评价与隐私政策。 加速器游戏版,一般来说,分为免费和付费两种模式。免费版通常会有一些限制,比如线路选择较少、加速效果一般、广告较多等等。而付费版则能提供更优质的加速体验,更好的线路、更稳定的连接,以及…

    2026年8月31日
    500
  • 如何解决货币代码处理问题?使用alcohol/iso4217库可以轻松搞定!

    可以通过以下地址学习 Composer:学习地址 在处理国际化项目时,货币代码的管理和转换是一个常见但又容易出错的任务。我曾经遇到过一个问题:需要在应用程序中准确处理和显示来自不同国家的货币信息。由于各国货币代码和符号的多样性,导致代码变得复杂且难以维护。幸运的是,通过使用 alcohol/iso4…

    用户投稿 2026年8月31日
    000
  • 使用minio搭建私有化对象存储服务

    使用minio搭建私有化对象存储服务使用minio搭建私有化对象存储服务使用minio搭建私有化对象存储服务使用minio搭建私有化对象存储服务

    在工作中,我们常常会接触到对象存储服务,但这些服务大多是云服务。对于需要对外开放的项目而言,这类服务是可行的。然而,当我们需要私有化部署时,如何继续使用对象存储呢? 这里介绍一个开源项目MinIO,使用它,我们可以轻松搭建属于自己的私有云服务。 MinIO是一个非常轻量级的服务,可以简单地与其他应用…

    2026年8月31日 用户投稿
    000
  • deepseek的官方网址

    deepseek的官方网址入口在哪里?这是不少网友都关注的问题,接下来由php小编为大家带来deepseek官方网页地址入口,感兴趣的网友一起随小编来瞧瞧吧! deepseek的官方网址 1、deepseek的官方网址☜☜☜☜☜点击保存 2、deepseek官方网页地址入口☜☜☜☜☜点击保存 【深度…

    2026年8月31日
    000
  • mysql怎么删除not null限制

    在mysql中,可以利用“ALTER TABLE”语句从指定表的列中删除“not null”非空限制,利用modify可以修改表中字段的数据类型和约束条件,语法为“ALTER TABLE 表名 MODIFY 字段名 INT NULL;”。 本教程操作环境:windows10系统、mysql8.0.2…

    2026年8月31日
    100
  • Spring Boot连接达梦数据库6出现网络超时警告怎么办?

    Spring Boot连接达梦数据库6:网络超时警告的解决之道 在使用Spring Boot连接达梦数据库6时,您可能会遇到“驱动程序不支持获取/设置连接的网络超时 (dm6.jdbc.driver.DmdbConnection.getNetworkTimeout()I)”警告。此警告虽然不影响数据…

    2026年8月31日
    000
  • 同城旅行app如何筛选特色民宿_同城旅行app筛选特色民宿实用技巧

    答案:通过地图模式、智能排序、图片核查和服务筛选可精准定位特色民宿。先用地图锁定景区或街区核心房源,再按收藏数和新上线筛选高人气新房,接着对比住客实拍与房东图片确保真实样貌,最后通过关键词和服务配置确认风格与需求匹配。 如果您在同城旅行App上寻找具有独特风格和体验的民宿,但面对海量信息无从下手,可…

    2026年8月31日
    000
  • Laravel开发建议:如何优化RESTful API设计与实现

    Laravel是一种广泛使用的PHP框架,用于快速构建高质量的Web应用程序。在Laravel开发中,RESTful API也变得越来越常见。本文将为开发人员提供一些关于如何优化RESTful API设计与实现的建议。 一、清晰的URL设计RESTful API的核心是URL设计。一个好的URL设计…

    2026年8月31日
    000
  • 亚马逊卖家后台大变动,将无法直接查看具体评论并联系买家

    亚马逊卖家后台大变动,将无法直接查看具体评论并联系买家亚马逊卖家后台大变动,将无法直接查看具体评论并联系买家亚马逊卖家后台大变动,将无法直接查看具体评论并联系买家亚马逊卖家后台大变动,将无法直接查看具体评论并联系买家

    7 月 1 日消息,根据电商派报道,部分卖家反馈在亚马逊后台收到了平台即将停用“买家评论”功能的通知。通知中提到,今年 9 月 30 日起,亚马逊将彻底停止使用“买家评论”,并启用全新的“买家之声”。 这两项功能之间存在显著差异。“买家评论”可以展示买家留下的详细评价内容,特别是针对产品某些具体特性…

    2026年8月31日 用户投稿
    000
  • 手机国补在哪里申请?附2025最新申请入口

    关于手机国补,需要明确的是,这通常并非一项全国统一、直接发放现金的补贴政策。在大多数情况下,“国补”是多种形式惠民措施的统称,可能体现为地方政府为提振消费而推出的消费券或专项补贴、通信运营商为推广5G套餐而提供的购机优惠,或是大型电商平台联合品牌方举办的以旧换新活动。这些政策具有很强的地域性和时效性…

    2026年8月31日
    000
  • 怎么使用InstanceMonitorDataType实例的监控数据集合

    本篇文章给大家带来的内容是关于怎么使用instancemonitordatatype实例的监控数据集合,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 InstanceMonitorDataType 节点名 InstanceMonitorData 子节点 以上就是怎么使用Instan…

    2026年8月31日
    400
  • Element Plus弹框内Three.js渲染出现空白区域,如何解决?

    Element Plus弹框中集成Three.js渲染3D场景时,底部出现空白区域,这并非Three.js渲染问题,而是CSS样式冲突导致。文章标题为“Element Plus和Three.js构建3D预览窗口,出现底部空白区域”,核心问题是Three.js渲染容器(#container)未能完全填…

    2026年8月31日
    000
  • 黑鲨手机一直开机关机循环怎么办

    黑鲨手机持续开机关机循环时,可尝试下列解决办法:1. 检查电源适配器或数据线损坏;2. 强制重启;3. 进入 Fastboot 模式清除缓存分区;4. 恢复出厂设置;5. 若以上方法无效,请联系官方客服或售后维修中心寻求帮助。 黑鲨手机一直开机关机循环的解决办法 黑鲨手机遇到一直开机关机循环的问题时…

    2026年8月31日
    100
  • HKC新款27寸QD-OLED显示器上市:2K 240Hz屏首发仅1999元

    10月14日,据相关报道,hkc全新发布了一款27英寸显示器——gs27qks,上市首发价为1999元。 该款显示器搭载了27英寸QD-OLED显示面板,具备178°(水平与垂直)的宽广可视角度,原生10bit色深,采用16:9显示比例,分辨率达到2560×1440,最高支持240Hz刷新率,GtG…

    2026年8月31日
    000
  • 通过 Eloquent 模型关联实现订单菜品分组

    本文旨在介绍如何使用 Laravel Eloquent 模型关联,根据餐厅 ID 获取订单信息,并将订单中的菜品按照订单 ID 进行分组,最终返回包含订单详细信息和菜品列表的 JSON 数据。通过 `with()` 和 `whereHas()` 方法,可以避免使用循环,提高查询效率,使代码更加简洁易…

    2026年8月31日
    100
  • 机械师曙光16 Air评测:酷睿Ultra加持,有AI PC那味儿了

    机械师曙光16 Air评测:酷睿Ultra加持,有AI PC那味儿了机械师曙光16 Air评测:酷睿Ultra加持,有AI PC那味儿了机械师曙光16 Air评测:酷睿Ultra加持,有AI PC那味儿了机械师曙光16 Air评测:酷睿Ultra加持,有AI PC那味儿了

    这是一台机械师曙光16 air。 作为机械师主推的轻薄本新品,这款笔记本继承了品牌一贯的精致设计风格,并搭载了最新的酷睿Ultra系列处理器。最高可选32GB+1TB的存储配置,使其在性能上能与一线厂商相媲美,甚至在某些方面还实现了超越。 (图源:雷科技) 这一代酷睿Ultra系列处理器,采用了全新…

    2026年8月31日 用户投稿
    000
  • 如何强制解除捡到的iPhone ID锁

    一、认识ID锁的核心作用 在面对捡到的iPhone时,首先要理解ID锁(即“激活锁”)是苹果为保障用户数据安全和设备防丢失所设计的重要机制。该功能会将设备与原机主的Apple ID绑定,防止未经授权的人员使用或激活设备。正因如此,任何试图绕过这一保护机制的行为都可能触碰法律红线,我们应以合法方式妥善…

    2026年8月31日
    000

发表回复

登录后才能评论
关注微信