是否有任何设计理由(就像他们放弃多重继承的原因一样)?
还是只是不够重要?
并且同样的问题适用于方法中的可选参数...这已经在vb.net的第一个版本中...所以它肯定没有导致MS不允许可选参数的懒惰,可能是架构决策..它似乎他们对此有所改变,因为C#4将包括那个......
有人知道决定是什么,他们为什么要放弃?
修改
也许你没有完全理解我。 我最近在计算程序(支持任意大小的数字,到最后一位数)上工作,其中一些方法每秒使用数百万次。
假设我有一个名为Add(int num)的方法,并且这个方法使用1作为参数(Add(1);
)很安静,我发现实现特殊方法更快一。我并不是说重载 - 编写一个名为AddOne的新方法,然后将Add方法复制到其中,除了使用num
而不是1
。对你来说这可能看起来非常奇怪,但它实际上更快。
(就像丑陋一样)
这让我想知道为什么C#不支持手动内联,这可能会非常有用 这里。
感谢。 (你为什么投票给我:S)
编辑2:
我问自己是否要加上这个。我非常熟悉为这样的项目选择像dot net这样的平台的奇怪(和缺点),但我认为点网优化比你想象的更重要......特别是诸如Any CPU等功能。
答案 0 :(得分:6)
要回答部分问题,请参阅Eric Gunnerson的博文:Why doesn't C# have an 'inline' keyword?
他的帖子引用:
编辑:我不确定延迟可选参数支持的原因,但是说他们“放弃”它听起来好像是根据我们对其他语言提供的期望来实现它。我想他们的优先级列表并不高,他们有最后期限可以为每个版本提供一些功能。到目前为止,它的重要性可能没有提高,特别是因为方法超载是一种可行的替代方案。同时我们得到了泛型(2.0),以及使LINQ成为可能的功能等(3.0)。我对语言的进展很满意;上述功能对我来说比在早期获得可选参数支持更重要。对于C#,内联发生在JIT 等级,而JIT通常会产生一个 体面的决定。
答案 1 :(得分:3)
手动内联几乎没用。 JIT编译器在适当的本机代码编译期间内联方法,我认为在几乎所有情况下JIT编译器都更好地猜测它何时适合于程序员。
至于可选参数,我不知道为什么它们在以前的版本中不存在。也就是说,我不喜欢它们在C#4中存在,因为我认为它们有些有害,因为参数被烘焙到消耗组件中,如果更改DLL中的标准值并且想要消耗,则必须重新编译它汇编使用新的。
编辑:
有关内联的一些其他信息。虽然您无法强制JIT编译器内联方法调用,但您可以强制它不内联方法调用。为此,您使用System.Runtime.CompilerServices.MethodImplAttribute,如下所示:
internal static class MyClass
{
[System.Runtime.CompilerServices.MethodImplAttribute(MethodImplOptions.NoInlining)]
private static void MyMethod()
{
//Powerful, magical code
}
//Other code
}
答案 2 :(得分:1)
我有根据的猜测:早期版本的C#没有可选参数的原因是因为它们在C ++中有不好的体验。在表面上,它们看起来足够直观,但是有一些令人讨厌的角落情况。我认为Herb Sutter的一本书更详细地描述了这一点;一般来说,它与覆盖virtual
方法有关。 Maximilian 在他的回答中提到了一个.NET角落案例。
你也可以通过手动编写多个重载来完成它们。对于类的 author ,这可能不是很好,但客户端几乎不会注意到重载和可选参数之间的区别。
所以这些年来没有他们,为什么C#4.0添加它们? 1)改进了与VB.NET的奇偶校验,以及2)更容易与COM互操作。
答案 3 :(得分:1)
我最近正在研究计算程序(支持任意大小的数字,到最后一位数),其中一些方法每秒使用数百万次。
然后你选择了一种错误的语言。我假设您实际上已经分析了您的代码(对吗?)并且知道除了可以帮助您的微优化之外没有其他任何东西。此外,您正在使用高性能的原生bigint库而不是自己编写,对吗?
如果这是真的,请不要使用.NET。如果您认为可以在部分专业化方面获得速度,请转到Haskell,C,Fortran或任何其他自动执行此操作的语言,或者可以向您公开内联手动操作。
如果Add(1)
对您来说真的很重要,那么堆分配也很重要。
但是,你应该看看探查者可以告诉你什么......
答案 4 :(得分:0)
C#已将它们添加到4.0:http://msdn.microsoft.com/en-us/library/dd264739(VS.100).aspx
至于为什么他们从一开始就没有完成,最有可能的原因是因为他们认为方法超载会带来更大的灵活性。通过重载,您可以根据您正在使用的其他参数指定多个“默认值”。它的语法也不多。
答案 5 :(得分:0)
即使在像C ++这样的语言中,内联也不能保证它会发生;这是编译器的提示。 The compiler can either take the hint, or do its own thing
C#是从生成的汇编代码中删除的另一个步骤(通过IL + JIT),因此更难以保证某些内联。此外,您遇到的问题包括JIT的x86 + x64实现行为不同。
答案 6 :(得分:0)
Java也不包含内嵌关键字。更好的Java JIT可以内联甚至虚拟方法,使用私有或最终之类的关键字也没有任何区别(过去曾经如此,但现在是古老的历史)。