关于 C# 函数参数修饰符 out 和 in 的真相

前言

嗨,大家好!

前两天有小伙伴问:"在 C# 里函数传递参数时加上 outin 到底有什么用?"

这确实是个值得探讨的好问题!

在 C# 中,outin 是两种非常有用的参数修饰符,它们各自有着独特的用途和优势,能够极大地提升我们的编程体验。

或许很多人对这两个修饰符的作用还不太了解,今天就让我们一起来揭开它们神秘的面纱吧!

话不多说,直接进入正题!

out 参数修饰符

核心作用

out 参数的主要作用是突破 return 只能返回单一值的限制,使得函数可以返回多个结果。

如果你需要一个函数同时返回两个或更多的值,out 参数就是你的最佳选择之一。

比如下面这个例子,它同时返回了两个值:

csharp 复制代码
private int OutTest(int a, out int b)
{
    b = a;  // 必须对 out 参数赋值
    a -= 100;  // 修改 a 的值
    return a;  // 返回 a 的新值
}

public void Main()
{
    int a = 2;
    int b;  // 声明 out 参数
    int c = OutTest(a, out b);  // 调用方法并传递 out 参数
    Console.WriteLine($"c 值 = {c}");  // 输出 c 的值
    Console.WriteLine($"b 值 = {b}");  // 输出 b 的值
}

运行结果如下:

使用规则

out 参数的使用很简单,主要是以下 2 条:

  1. out参数的设计意图是由被调用方法赋值,所以调用方传递的变量无需预先赋值,比如上例。

  2. 调用时需显式使用out关键字,例如上例中的 OutTest(a, out b)

应用场景

out 参数通常应用在下面这 2 个场景:

  1. 解析操作,比如C#的内置方法 int.TryParse(string, out int result)

  2. 需要返回多个计算结果的方法,比如坐标转换、状态码+结果分离等

in 参数修饰符

核心作用

in 的作用是传递一个只读的参数给方法,这意味着方法只能使用这个参数,而不能改变它的值。

这在处理大型结构体时非常有用,可以避免不必要的数据复制,从而提高性能。

如果你试图修改 in 参数的值,就会引发如下的错误:

但是,有一个特殊情况是,如果参数是一个类型,虽然你不能重新赋值这个参数,但可以改变参数的成员的数据,比如:

复制代码
public class Point
{
    public int x;
    public int y;
}

private void InTest(in Point point)
{
    Point point2 = new Point();
    // point = point2; 	// 这行代码会导致编译错误
    point.x = 10;		// 这是允许的	
}
使用规则

使用 in 参数的规则也很简单:

  1. 方法不能对 in 参数重新赋值。
  2. 调用时可以显式使用in关键字,也可以省略。
应用场景

in 参数主要用于下成这 2 个场景:

  1. 需要确保方法不会意外修改输入参数时,比如数学库中的计算函数

  2. 在确定无需改变输入参数的情况下,使用 in 修饰符以改善性能,例如传递3D图形计算中的矩阵或向量

总结

总的来说,在 C# 中合理使用 outin 参数修饰符,不仅能优化代码性能,还能增强数据安全性,实现更灵活的参数传递逻辑。

好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!

最后,如果你有更好的想法或建议,欢迎留言讨论!

往期精彩

  1. 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
  2. C#12 中 5 个节省你开发时间的的改进
  3. C# 静态类,高手不想让你知道的 15 个真相
  4. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  5. 用 C# Stopwatch 计时,让代码性能飞起来!
  6. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  7. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  8. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  9. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  10. C# AutoMapper 10个常用方法总结
  11. C# 7个方法比较两个对象是否相等
  12. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号(名称:代码掌控者)!

相关推荐
bugcome_com8 小时前
零基础入门C#:一篇搞懂核心知识点
c#
程序员敲代码吗11 小时前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
缺点内向13 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
喵叔哟13 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_9307077814 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
初级代码游戏14 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
大空大地202616 小时前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
kylezhao201917 小时前
C#序列化与反序列化详细讲解与应用
c#
JQLvopkk17 小时前
C# 实践AI :Visual Studio + VSCode 组合方案
人工智能·c#·visual studio
故事不长丨17 小时前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#