静态定义和使用方法而不是使用实例化类中的方法是否存在内存或性能差异?当方法不是静态的时,方法本身是否会使用类的每个实例占用内存?
也许静态方法中声明的任何变量都是非线程安全的?
/// <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++;
}
}
答案 0 :(得分:7)
没有区别。如您的示例所示,实例方法在逻辑上只不过是一个静态方法,其中第一个参数名为“this”。唯一的区别是在实例方法中自动检查“this”是否为null。它不是静态方法。
现在,虚拟方法会导致性能成本,因为实际调用的方法必须在运行时计算,而不是在编译时计算。这可以为程序的运行时增加几纳秒,并且还排除了某些优化,例如内联。
关于线程安全:是否安全使用变量是整个程序的属性,而不是方法是否为静态的属性。
答案 1 :(得分:2)
没有;实例方法不会占用每个实例的任何空间。即使虚拟方法也不这样做 - 所有实例只使用一个方法表。
也就是说,性能差异非常小:实例方法将this
引用作为隐藏参数,并且调用点可能需要检查空引用。这使得调用方法稍微昂贵一点,但差异几乎不重要。
虽然在您的示例中,我非常怀疑JIT编译器将内联该方法(无论它是否为静态)并以任何方式生成相同的代码。
答案 2 :(得分:1)
静态方法中声明的变量绝对不是静态的。见前,http://blogs.msdn.com/b/csharpfaq/archive/2004/05/11/why-doesn-t-c-support-static-method-variables.aspx。
以下是最新的常见问题解答:http://msdn.microsoft.com/en-us/library/79b3xss3.aspx:“C#不支持静态局部变量(在方法范围内声明的变量)。”
答案 3 :(得分:0)
静态方法和实例方法不可互换。它们用于完全不同的情况以解决完全不同的问题。您应该使用适合您想要做的任何类型的方法。
由于您不会处于任何一种方法适合手头任务的位置,因此两种方法之间的性能差异(如果有的话)是无关紧要的。你应该在逻辑和语义上做适合你的程序。