Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实例中的静态方法_C#_Static Code Analysis - Fatal编程技术网

C# 实例中的静态方法

C# 实例中的静态方法,c#,static-code-analysis,C#,Static Code Analysis,直截了当的问题:如果我运行代码分析,它告诉我即使在非静态类中也要使方法保持静态。 据我所知,静态方法是JIT的,并在堆中的类型对象上运行。因此,在非静态类中使方法静态不意味着实例必须在堆中搜索类型对象并在那里运行方法吗 这不是意味着性能问题吗?当然没什么大不了的,但我还是对这个感兴趣。不,不是那样的 静态方法实际上比非静态方法在不知不觉中更有效,因为A它没有传递给它的隐藏this指针,b因为它是静态的,框架不必做任何关于它是虚拟的事情,当然最后一点也适用于非虚拟成员方法 特别是,请查看那里关于M

直截了当的问题:如果我运行代码分析,它告诉我即使在非静态类中也要使方法保持静态。 据我所知,静态方法是JIT的,并在堆中的类型对象上运行。因此,在非静态类中使方法静态不意味着实例必须在堆中搜索类型对象并在那里运行方法吗


这不是意味着性能问题吗?当然没什么大不了的,但我还是对这个感兴趣。

不,不是那样的

静态方法实际上比非静态方法在不知不觉中更有效,因为A它没有传递给它的隐藏this指针,b因为它是静态的,框架不必做任何关于它是虚拟的事情,当然最后一点也适用于非虚拟成员方法

特别是,请查看那里关于MethodTable和MethodSlot表的信息


它没有明确地讨论静态方法,但它确实解释了如何在最低的汇编程序级别进行方法调用,因此您可以看到为什么静态方法调用是有效的。

不,它不是这样工作的

静态方法实际上比非静态方法在不知不觉中更有效,因为A它没有传递给它的隐藏this指针,b因为它是静态的,框架不必做任何关于它是虚拟的事情,当然最后一点也适用于非虚拟成员方法

特别是,请查看那里关于MethodTable和MethodSlot表的信息


它没有明确讨论静态方法,但它确实解释了如何在最低的汇编程序级别进行方法调用,因此您将能够了解为什么静态方法调用是有效的。

关于静态方法与实例方法的性能比较的好文章:

TLDR:

大多数情况下,实例与静态的性能成本低于 可以忽略不计的 你滥用的地方通常都会付出代价 例如静态的,反之亦然。如果你不让它成为你生活的一部分 在静态和实例之间进行决策,您更有可能获得 正确的结果

在另一种类型中,静态泛型方法很少出现 导致创建的类型少于实例泛型方法, 这可以使它有时有一个小的好处变成很少使用 而且很少提到它在生命周期中使用的类型 应用程序,而不是它的调用频率。一旦你得到了他想要的 在那篇文章中,你会发现它与 不管怎样,大多数静态与实例决策


关于静态方法与实例方法性能比较的好文章:

TLDR:

大多数情况下,实例与静态的性能成本低于 可以忽略不计的 你滥用的地方通常都会付出代价 例如静态的,反之亦然。如果你不让它成为你生活的一部分 在静态和实例之间进行决策,您更有可能获得 正确的结果

在另一种类型中,静态泛型方法很少出现 导致创建的类型少于实例泛型方法, 这可以使它有时有一个小的好处变成很少使用 而且很少提到它在生命周期中使用的类型 应用程序,而不是它的调用频率。一旦你得到了他想要的 在那篇文章中,你会发现它与 不管怎样,大多数静态与实例决策


我认为关键是,您不是在实例上调用静态方法,而是在类本身上调用静态方法。任何不直接依赖实例信息的方法都可以并且基于代码分析也应该标记为静态,然后按如下方式调用:

NonstaticClass.TheStaticMethod();
相反,如果

NonstaticClass inst = new NonstaticClass();
inst.TheStaticMethod();

这是因为在类实例上查找和运行静态方法所需的开销比在类实例上运行非静态方法所需的开销要小。

我认为关键在于,您不是在实例上调用静态方法,而是在类本身上调用静态方法。任何不直接依赖实例信息的方法都可以并且基于代码分析也应该标记为静态,然后按如下方式调用:

NonstaticClass.TheStaticMethod();
相反,如果

NonstaticClass inst = new NonstaticClass();
inst.TheStaticMethod();

这是因为在类实例上查找和运行静态方法所需的开销小于非静态方法。

潜在重复:这是性能问题。非静态方法具有对类实例的隐藏参数引用。如果不使用引用,最好将此方法设置为静态,不包括附加的方法参数。同样有趣的是:给出了一个彻底的解释如果您考虑使用静态方法,请记住,静态意味着线程安全!!!静态方法可以在任何时候从任何线程调用,由静态方法来确保它正确处理并发性。出于这个原因,我通常避免使用不必要的静态方法。潜在的重复:这是性能问题。非国家
c方法具有对类实例的隐藏参数引用。如果不使用引用,最好将此方法设置为静态,不包括附加的方法参数。同样有趣的是:给出了一个彻底的解释如果您考虑使用静态方法,请记住,静态意味着线程安全!!!静态方法可以在任何时候从任何线程调用,由静态方法来确保它正确处理并发性。出于这个原因,我通常避免使用不必要的静态方法。好吧,这似乎是对的,但它必须搜索类型对象才能执行它,对吗?@MatthiasMüller它只在JIT过程中执行,即在程序的生命周期中只执行一次。有关详细信息,请查看调用静态方法时的搜索OK这似乎是正确的,但它必须搜索类型对象才能执行它,对吗?@MatthiasMüller它仅在JIT过程中执行,即在程序的生命周期中仅执行一次。有关详细信息,请查看调用静态方法时的搜索。我的问题更多的是,既然它必须在HeapAh中搜索类型,那么为什么它很少被听到,而不是被听到。正如其他人所回答的那样,关键是不必关心这个指针和VMT。我的问题更多的是,为什么它被偷听的更少,而不是更多,因为它必须在HeapAh中搜索类型,我明白了。正如其他人所回答的,重点是不必关心这个指针和VMT。