c# - 运行时 ref 和 out 有何不同?
问题描述
在他们给出的许多文章中,它们ref
以out
相同的方式工作。即使在编译时以相同的方式识别两者,但它们在运行时(CLR)是不同的。谁能解释它是如何不同的?和功能呢?
我在这段代码中尝试了同样的方法
public static void Main()
{
int par = 7;
Program x= new Program();
x.RefMethod(out par);
Console.WriteLine(par);
x.RefMethod1(ref par);
Console.WriteLine(par);
Console.ReadLine();
}
public void RefMethod(out int i)
{
i = 10;
}
public void RefMethod1(ref int i)
{
i = 20;
}
refmethod 的 ILDASM:
method public hidebysig instance void RefMethod([out] int32& i) cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldc.i4.s 10
IL_0004: stind.i4
IL_0005: ret
} // end of method Program::RefMethod
Refmethod1 的 ILDASM:
method public hidebysig instance void RefMethod1(int32& i) cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldc.i4.s 20
IL_0004: stind.i4
IL_0005: ret
} // end of method Program::RefMethod1
以上清楚地表明两者在某一点上是不同的,即在该方法初始化时。请任何人都可以帮助我解决我的问题吗?
请任何人清楚地回答这个问题。我仍然没有得到答案:(
解决方案
ref 和 out 之间的区别不在于 CLR,而在于 C# 语言本身。Ref 和 Out 的不同之处在于它们每个的“编译器需要不同的行为”。编译时也不允许方法重载。
正如您从代码中看到的,唯一的变化是地址引用,特别是这一行(如果您输入值 10,这将上升为 10)。
IL_0002: ldc.i4.s 20
推荐阅读
- rxjs - 如何使用 RxJS 创建队列
- javascript - 在 Highcharts 漏斗可视化的左侧或右侧添加标签
- sql-server - 将图像字段数据从 SQL Server 复制到 Azure Blob 存储作为 blob 块
- php - php MySQL查询两个日期时间之间的时间,但如果在范围内完成,则包括范围外的分钟数
- javascript - 使用 map() 和 filter() 从嵌套数组映射的新数组中删除未定义的元素
- wpf - WPF - 另一个程序集中的样式中的图像源
- c++ - 我有一个返回字符串向量的函数。它需要两个字符串,并返回一个字符串中缺少的字符串
- c# - 使用 GetUserASync(用户)的单元测试控制器
- node.js - React Router Routes 在部署到 Heroku 时不起作用
- r - 通过在 R 中的多列进行映射来选择重复的行