问题在标题中
答案 0 :(得分:14)
我看到的答案假设你在谈论编译或JIT时间内联 - 而且它们完全正确。但是,我所听到的“内联”这个词的另一个用途是用于lambda表达式 - 在C#中,类似于:
public IEnumerable<int> Foo()
{
int[] numbers = new[] { 1, 5, 2, 5, 6 };
return numbers.Select(x => x+10);
}
x => x+10
(一个lambda表达式)可以被视为源代码术语中的“内联函数”,因为它是在另一个方法中声明为“内联”的额外函数。
是的,VB9有这个:
Dim len As Func(Of String, Integer) = Function(x) x.Length
Console.WriteLine(len("foo"))
我认为VB9与C#相比有更多的限制 - 例如,我不认为你可以创建一个Action<T>
(或任何其他具有void返回的委托类型在VB9中使用lambda表达式,而在C#中则很容易。同样地,我认为lambda必须只是VB9中的单个表达式,而在C#中,它可以是括号中的整个块。
从VB10开始,您也可以在VB中创建多行lambda表达式。
当然,如果问题实际上是指执行而不是源代码,那么所有这些都无关紧要:)
答案 1 :(得分:7)
内联是CLR(JIT)的责任,并且在内联函数时存在一些条件:
正如您可能会发现的那样,在代码方面,32字节不是很,它适用于快速和小的if-else条件测试,属性getter / setter。我不认为你可以通过内联大量代码获得任何速度。
答案 2 :(得分:5)
这个问题5年后还有一些活动(已经???)
with .net 4.5 it is now possible to specify inline method
只需使用此attribut
<MethodImplAttribute(MethodImplOptions.AggressiveInlining)>
答案 3 :(得分:2)
.NET团队明智地认为这些功能在编程语言本身中没有任何地位,因为编译器在决定内联的内容方面更好。这是相当积极的,但事实是,现代C ++实际上经常忽略inline
指令,以决定内联函数的决策过程。
答案 4 :(得分:2)
这是一个很好的设施:
我们有一个标准的日志记录功能,传递呼叫者的名字通常很有用。但是,如果将日志记录设置为低详细程度,则日志记录功能只会返回以帮助提高性能。为了避免调用者对System.Reflection.MethodBase.GetCurrentMethod.Name进行CPU昂贵的调用,只为日志函数不使用它们,如果我们可以创建一个预先决定是否打扰查找的内联函数会很好方法的名称:
Public Inline Function GetMyname(iLogLevel) as string
if iLogLevel < 3 then return ""
return System.Reflection.MethodBase.GetCurrentMethod.Name()
End Function
然后在来电者中,我们可以放一条整齐的线路,如:
Log(2,GetMyname(2)&amp;“:发生了一些事情”)
但是如果编译器决定不内联GetMyname()(肯定会这样),那么日志中出现的方法名将始终为“GetMyName” - 根本不用。
称我为老式,但如果我们开始将所有决定都留给编译器(或CLR!),那么我们也可以寻找新的职业并留给“.Net团队”。有时,软件设计师实际上最了解?
答案 5 :(得分:1)
您不能明确地将函数声明为内联函数,但如果JIT优化器看到了好处,则它可以自由内联函数。
答案 6 :(得分:0)
注意到Tom发布的5月11号问题,我不得不说如果你的应用程序真正性能至关重要,那么使用依赖于CLR的语言可能不是你最好的选项。
事实上,面向对象的设计可能也不是您的最佳选择。您可能希望认真考虑C作为替代方案。