将方法定义为静态是不是更好?

本文关键字:是不是 更好 静态 方法 定义 | 更新日期: 2023-09-27 18:09:31

是否存在静态定义和使用方法而不是在实例化类中使用方法的内存或性能差异?当方法不是静态的时候,方法本身是否占用类的每个实例的内存?

也许在静态方法中声明的任何变量都是非线程安全的?
/// <summary>
/// A class using instance methods (non-static)
/// </summary>
public class Junk
{
    public int x {get; protected set;}
    public Junk(int x = 0)
    {
        this.x = x;
    }
    public void Increment()
    {
        this.x++;
    }
}

/// <summary>
/// A class using static methods
/// </summary>
public class Junk
{
    public int x {get; protected set;}
    public Junk(int x = 0)
    {
        this.x = x;
    }
    public static void Increment(Junk thisJunk)
    {
        thisJunk.x++;
    }
}

将方法定义为静态是不是更好?

没有区别。正如您的示例所示,实例方法在逻辑上只不过是一个静态方法,其中第一个参数名为"this"。唯一的区别是在实例方法中会自动检查"this"是否为空;它不在静态方法中。

现在,虚拟方法确实会导致性能成本,因为实际调用的方法必须在运行时计算,而不是在编译时计算。这可能会使程序的运行时时间增加几纳秒,并且还会妨碍某些优化,例如内联。

至于线程安全:是否安全地使用变量是整个程序 的属性,而不是方法是否是静态的属性。

不;实例方法不会占用每个实例的任何空间。即使是虚方法也做不到这一点——只有一个方法表可供所有实例使用。

也就是说,有一个非常小的性能差异:实例方法将this引用作为隐藏参数,并且调用站点可能需要检查null引用。这使得调用该方法的代价稍微高一些,但差异几乎无关紧要。

尽管在您的示例中,我高度怀疑JIT编译器将内联方法(无论它是否是静态的)并以任何方式生成相同的代码

静态方法中声明的变量肯定不是静态的。参见例子http://blogs.msdn.com/b/csharpfaq/archive/2004/05/11/why-doesn-t-c-support-static-method-variables.aspx。

这里有一个最近的FAQ: http://msdn.microsoft.com/en-us/library/79b3xss3.aspx:"c#不支持静态局部变量(在方法作用域中声明的变量)。"

静态方法和实例方法不可互换。它们在完全不同的情况下被用来解决完全不同的问题。您应该使用适合于您想要做的事情的任何类型的方法。

由于您不会处于任何一种方法类型都适合手头任务的位置,因此两种方法之间的性能差异(如果有的话)是无关紧要的。你应该做在逻辑上和语义上适合你的程序的事情。