如果函数声明是静态的还是非静态的,如果它中的字段是静态的,它会有什么不同吗?

时间:2011-12-27 22:59:44

标签: c# static-members static

    static int _i;
    static void Display()
    {
        //operates on _i;
    }

    static int _i;
    void Display()
    {
        //operates on _i;
    }

哪些方案特定于方法的静态 - 非静态问题?

编辑;注意:这个问题不是关于静态和非静态方法之间的差异,正如许多人似乎回答的那样。问题是我应该担心差异的情景/用例是什么。为了清楚起见,请参阅@ ziesemer的答案,它似乎正好解决了这个问题。

3 个答案:

答案 0 :(得分:6)

存在细微差别,实例(非静态)版本使用名为this的“隐藏”参数实现。由于它不会用于访问静态字段,因此在这里使用静态方法稍微经济一些。

一般建议是:如果方法可以是静态的,那么将其设为静态。但这更多的是表现出明确的意图而不是表现。

答案 1 :(得分:2)

非静态函数允许您创建包含函数的类的子类,为一个或多个方法提供重写方法 - 提供可扩展性和自定义选项。这不适用于非静态函数。另一方面,非静态函数要求您在调用其函数之前首先创建该类的实例。

我还会重新审视为什么你有一些静态变量,并鼓励你重新访问 - 而不是让一切都是非静态的。这将允许您在同一运行时内拥有多个独立的所有实例。通过使变量保持静态,您实际上是强制每个人使用相同的配置(或者您存储的变量) - 即使它们创建了包含类的多个实例。

答案 2 :(得分:0)

当在类上调用非静态方法时,它会将相关对象作为不可见的第一个参数“this”给出,并按值传递;当在结构上调用非静态方法时,会给它一个不可见的第一个参数“this”,通过引用传递。该函数将被传递,无论函数是否实际使用它,因为调用者在许多情况下无法知道函数是否实际使用该参数。因此,函数必须期望调用者传入“this”,不知道它将不会被使用,因此如果函数不使用“this”,它必须忽略第一个传入的参数。因此,即使调用者知道该函数不会使用“this”,它也必须传入一个额外的参数才能忽略该函数。