C#的方法参数的无修饰符以及 in、out、ref(in/out) 修饰符的区别
无修饰符
无修饰符的参数有如下特点:
- 传入的参数可以重新赋值
- 不影响传入参数的原始值
IN 修饰符
IN 修饰符的参数有如下特点:
- 传入的参数不可以重新赋值
- 不影响传入参数的原始值
OUT 修饰符
OUT 修饰符的参数有如下特点:
- 传入的参数不需要赋值
- 影响传入参数的原始值
- 在函数返回值之前需要对 out 修饰的参数赋值
REF(IN/OUT) 修饰符
OUT 修饰符的参数有如下特点:
- 传入的参数可以重新赋值
- 影响传入参数的原始值
示例代码
using System;
namespace Demo
{
public class HelloWorld
{
public string Hello { get; set; } = "Hello";
public string World { get; set; } = "World";
public string Space { get; set; } = " ";
public override string ToString()
{
return Hello + Space + World;
}
}
public class Program
{
static void Main(string[] args)
{
var hello = "Hello";
var space = " ";
var world = "World";
Console.WriteLine("原始值:");
Console.WriteLine(hello + space + world);
Console.WriteLine("---------------------");
Console.WriteLine("JoinText(无修饰符):");
var value1 = JoinText(hello, space, world);
Console.WriteLine("调用函数后的原始值:" + hello + space + world);
Console.WriteLine("调用函数后的结果值:" + value1);
Console.WriteLine("---------------------");
Console.WriteLine("JoinText(in 修饰符):");
var value2 = JoinTextIn(in hello, in space, in world);
Console.WriteLine("调用函数后的原始值:" + hello + space + world);
Console.WriteLine("调用函数后的结果值:" + value2);
Console.WriteLine("---------------------");
Console.WriteLine("JoinText(out 修饰符):");
string value3 = "你好";//没有必要赋值
JoinTextOut(hello, space, world, out value3);
Console.WriteLine("调用函数后的原始值:" + hello + space + world);
Console.WriteLine("调用函数后的结果值:" + value3);
Console.WriteLine("---------------------");
Console.WriteLine("JoinText(ref[in/out] 修饰符):");
var value4 = JoinTextRef(ref hello, ref space, ref world);
Console.WriteLine("调用函数后的原始值:" + hello + space + world);
Console.WriteLine("调用函数后的结果值:" + value4);
Console.WriteLine("---------------------");
Console.WriteLine("hello world 原始对象:");
var hw = new HelloWorld();
Console.WriteLine(hw.ToString());
Console.WriteLine("---------------------");
Console.WriteLine("HelloWorldChinese(无修饰符):");
var hw1 = new HelloWorld();
var hw1Cn = HelloWorldChinese(hw1);
Console.WriteLine("调用函数后的原始值:" + hw1.ToString());
Console.WriteLine("调用函数后的结果值:" + hw1Cn.ToString());
Console.WriteLine("---------------------");
Console.WriteLine("HelloWorldChinese( in 修饰符):");
var hw2 = new HelloWorld();
var hw2Cn = HelloWorldChineseIn(hw2);
Console.WriteLine("调用函数后的原始值:" + hw2.ToString());
Console.WriteLine("调用函数后的结果值:" + hw2Cn.ToString());
Console.WriteLine("---------------------");
Console.WriteLine("HelloWorldChinese( out 修饰符):");
var hw3 = new HelloWorld();
HelloWorldChineseOut(hw3, out HelloWorld hw3Cn);
Console.WriteLine("调用函数后的原始值:" + hw3.ToString());
Console.WriteLine("调用函数后的结果值:" + hw3Cn.ToString());
Console.WriteLine("---------------------");
Console.WriteLine("HelloWorldChinese( ref 修饰符):");
var hw4 = new HelloWorld();
var hw4Cn = HelloWorldChineseRef(ref hw4);
Console.WriteLine("调用函数后的原始值:" + hw4.ToString());
Console.WriteLine("调用函数后的结果值:" + hw4Cn.ToString());
}
/// <summary>
/// 拼接文本
/// </summary>
/// <param name="hello"></param>
/// <param name="space"></param>
/// <param name="world"></param>
/// <returns></returns>
public static string JoinText(string hello, string space, string world)
{
hello = "你好";
world = "世界";
return hello + space + world;
}
/// <summary>
/// 拼接文本,使用 in 修饰符的参数无法重新赋值,如 hello="你好;只能定义新的变量赋值
/// </summary>
/// <param name="hello"></param>
/// <param name="space"></param>
/// <param name="world"></param>
/// <returns></returns>
public static string JoinTextIn(in string hello, in string space, in string world)
{
//无法分配到 变量 'in string' ,因为它是只读变量
//无法分配到 变量 'in string' ,因为它是只读变量
//hello = "你好";//只读变量,不能重新赋值,只能读取
//world = "世界";//只读变量,不能重新赋值,只能读取
//return hello + space + world;
var hello2 = "你好";
var world2 = "世界";
return hello2 + space + world2;
}
/// <summary>
/// 拼接文本,使用 out 修饰符的参数不需要进行赋值(此行为无意义),因为是用于接收返回值用的,
/// 同样,在函数结束前(如提前 return),函数内需要对 out 的参数赋值
/// </summary>
/// <param name="hello"></param>
/// <param name="space"></param>
/// <param name="world"></param>
/// <returns></returns>
public static void JoinTextOut(string hello, string space, string world, out string result)
{
hello = "你好";
world = "世界";
result = hello + space + world;
}
/// <summary>
/// 拼接文本,使用 ref 修饰符的参数修改了值,对调用函数传的原始参数的值也会修改
/// </summary>
/// <param name="hello"></param>
/// <param name="space"></param>
/// <param name="world"></param>
/// <returns></returns>
public static string JoinTextRef(ref string hello, ref string space, ref string world)
{
hello = "你好";
world = "世界";
return hello + space + world;
}
/// <summary>
/// hello world 汉化
/// </summary>
/// <param name="helloWorld"></param>
/// <returns></returns>
public static HelloWorld HelloWorldChinese(HelloWorld helloWorld)
{
var helloWorld2 = new HelloWorld()
{
Hello = "你好",
World = "世界"
};
helloWorld = helloWorld2;
return helloWorld;
}
/// <summary>
/// hello world 汉化
/// </summary>
/// <param name="helloWorld"></param>
/// <returns></returns>
public static HelloWorld HelloWorldChineseIn(in HelloWorld helloWorld)
{
var helloWorld2 = new HelloWorld()
{
Hello = "你好",
World = "世界"
};
//helloWorld = helloWorld2;//只读变量,不能重新赋值,只能读取
return helloWorld2;
}
/// <summary>
/// hello world 汉化
/// </summary>
/// <param name="helloWorld"></param>
/// <returns></returns>
public static void HelloWorldChineseOut(HelloWorld helloWorld, out HelloWorld result)
{
var helloWorld2 = new HelloWorld()
{
Hello = "你好",
World = "世界"
};
helloWorld = helloWorld2;
result = helloWorld;
}
/// <summary>
/// hello world 汉化
/// </summary>
/// <param name="helloWorld"></param>
/// <returns></returns>
public static HelloWorld HelloWorldChineseRef(ref HelloWorld helloWorld)
{
var helloWorld2 = new HelloWorld()
{
Hello = "你好",
World = "世界"
};
helloWorld = helloWorld2;
return helloWorld;
}
}
}
示例代码结果
原始值:
Hello World
---------------------
JoinText(无修饰符):
调用函数后的原始值:Hello World
调用函数后的结果值:你好 世界
---------------------
JoinText(in 修饰符):
调用函数后的原始值:Hello World
调用函数后的结果值:你好 世界
---------------------
JoinText(out 修饰符):
调用函数后的原始值:Hello World
调用函数后的结果值:你好 世界
---------------------
JoinText(ref[in/out] 修饰符):
调用函数后的原始值:你好 世界
调用函数后的结果值:你好 世界
---------------------
hello world 原始对象:
Hello World
---------------------
HelloWorldChinese(无修饰符):
调用函数后的原始值:Hello World
调用函数后的结果值:你好 世界
---------------------
HelloWorldChinese( in 修饰符):
调用函数后的原始值:Hello World
调用函数后的结果值:你好 世界
---------------------
HelloWorldChinese( out 修饰符):
调用函数后的原始值:Hello World
调用函数后的结果值:你好 世界
---------------------
HelloWorldChinese( ref 修饰符):
调用函数后的原始值:你好 世界
调用函数后的结果值:你好 世界
生活,有时候就是很简单,有时候却很要命。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!