C# 此属性的作用是:MethodImplOptions.noInLine(或:什么是';内联';方法)

C# 此属性的作用是:MethodImplOptions.noInLine(或:什么是';内联';方法),c#,C#,可能重复: 我一直在调试代码,问题的“可能”根源在于标记有以下代码的函数: [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] protected virtual void PropertyHasChanged() 阅读MSDN时会这样说:指定该方法不能内联。 但什么是“内联”方法 编辑: 澄清:在每个属性的SET方法中调用Pro

可能重复:

我一直在调试代码,问题的“可能”根源在于标记有以下代码的函数:

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
protected virtual void PropertyHasChanged()
阅读MSDN时会这样说:指定该方法不能内联。

但什么是“内联”方法

编辑:


澄清:在每个属性的SET方法中调用
PropertyHasChanged()
方法,并更新(向其中添加1)内部对象计数器。当该计数器>0时,对象被标记为“脏”,并将在调用Save时保存到数据库中。当计数器=0时,对象将不会保存到数据库中。现在我有了这样一个想法,这段代码有时不会执行(计数器不会增加),因此对象不会保存到数据库中,

内联方法/属性意味着编译器接受它并用它的内容替换对它的调用(确保变量正确等)。这不是C#特有的东西

这样做是为了正常的性能

例如,使用此方法和调用:

private long Add(int x, int y)
{
   return x + y;
}

var z = Add(x, y);
编译器可以将其内联为(消除过程中的方法):


Wikipeida文章以以下内容开头:

在计算中,内联扩展或内联是一种手动优化或编译器优化,用被调用方的主体替换函数调用站点。这种优化可以提高运行时的时间和空间利用率,但可能会增加程序的最终大小(即二进制文件大小)


请注意,虽然这是一个有效的问题,但该方法的内联与否几乎肯定与您调试的任何问题无关。@Veger:我读过那篇文章,但它主要是关于C#中的内联方法,而不是它的含义…(我的dupe候选者不是C#特定的,但确实解释了内联的实际含义)投票率最高的答案是:“内联方法只是一种编译器优化,其中函数的代码被滚动到调用者中。”这(非常简单)描述了方法代码直接放入调用上下文中(而不是创建实际的方法)。这就是内联。这就像一场经典的线程竞赛。是的,内联可能会影响这样的bug。非常感谢您的清晰解释!为了清楚起见,C#编译器永远不会内联方法。这是抖动的任务。
var z = x + y;