是否有任何设计理由(就像他们放弃多重继承的原因一样)?

还是只是不够重要?

并且同样的问题适用于方法中的可选参数...这已经在vb.net的第一个版本中...所以它肯定没有导致MS不允许可选参数的懒惰,可能是架构决策..它似乎他们对此有所改变,因为C#4将包括那个......

有人知道决定是什么,他们为什么要放弃?

修改

也许你没有完全理解我。 我最近在计算程序(支持任意大小的数字,最后一位数)上工作,其中一些方法每秒使用数百万次。

假设我有一个名为Add(int num)的方法,这个方法用1作为参数安静很多( Add(1); ),我发现它更快特别为一个人实施特殊方法。我并不是说重载 - 编写一个名为AddOne的新方法,并将Add方法复制到其中,除了使用 num 而不是使用 1 。对你来说这可能看起来非常奇怪,但它实际上更快。

(就像丑陋一样)

这让我想知道为什么C#不支持手动内联,这可能会非常有用 这里。

感谢。 (你为什么投票给我:S)

编辑2:

我问自己是否要加上这个。我非常熟悉为这样的项目选择像dot net这样的平台的奇怪(和缺点),但我认为点网优化比你想象的更重要......特别是诸如Any CPU等功能。

有帮助吗?

解决方案

要回答部分问题,请参阅Eric Gunnerson的博文:为什么C#没有'内联'关键字?

他的帖子引用:

  

对于C#,内联发生在JIT   等级,而JIT通常会产生一个   体面的决定。

编辑:我不确定延迟可选参数支持的原因,但是说他们“放弃”了听起来好像他们应该根据我们对其他语言提供的期望来实现它。我想他们的优先级列表并不高,他们有最后期限可以为每个版本提供一些功能。到目前为止,它的重要性可能没有提高,特别是因为方法超载是一种可行的替代方案。同时我们得到了泛型(2.0),以及使LINQ成为可能的功能等(3.0)。我对语言的进展很满意;上述功能对我来说比在早期获得可选参数支持更重要。

其他提示

手动内联几乎没用。 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
}

我有根据的猜测:早期版本的C#没有可选参数的原因是因为它们在C ++中有不好的体验。在表面上,它们看起来足够直观,但是有一些令人讨厌的角落情况。我认为Herb Sutter的一本书更详细地描述了这一点;一般来说,它与重写虚拟方法有关。 Maximilian 在他的回答中提到了一个.NET角落案例。

你也可以通过手动编写多个重载来完成它们。对于类的 author ,这可能不是很好,但客户端几乎不会注意到重载和可选参数之间的区别。

所以这些年来没有他们,为什么C#4.0添加它们? 1)改进了与VB.NET的奇偶校验,以及2)更容易与COM互操作。

  

我最近正在研究计算程序(支持任意大小的数字,到最后一位数),其中一些方法每秒使用数百万次。

然后你选择了一种错误的语言。我假设您实际上已经分析了您的代码(对吗?)并且知道除了可以帮助您的微优化之外没有其他任何东西。此外,您正在使用高性能的原生bigint库而不是自己编写,对吗?

如果这是真的,请不要使用.NET。如果您认为可以在部分专业化方面获得速度,请转到Haskell,C,Fortran或任何其他自动执行此操作的语言,或者可以向您公开内联手动执行此操作。

如果 Add(1)对你很重要,那么堆分配也很重要。

但是,你应该看看探查者可以告诉你什么......

C#已将它们添加到4.0中: http:/ /msdn.microsoft.com/en-us/library/dd264739(VS.100).aspx

至于为什么他们从一开始就没有完成,最有可能的原因是因为他们认为方法超载会带来更大的灵活性。通过重载,您可以根据您正在使用的其他参数指定多个“默认值”。它的语法也不多。

即使在像C ++这样的语言中,内联也不能保证它会发生;这是编译器的提示。 编译器既可以提示,也可以自己动手事

C#是从生成的汇编代码中删除的另一个步骤(通过IL + JIT),因此更难以保证某些内联。此外,您遇到的问题包括JIT的x86 + x64实现行为不同。

Java也不包含内嵌关键字。更好的Java JIT可以内联甚至虚拟方法,使用私有最终等关键字也没有任何区别(过去曾经如此,但现在这是古老的历史)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top