【问题标题】:Is it going to make any difference if a function is declared static or non static if the fields in it are static? [duplicate]如果函数中的字段是静态的,如果函数被声明为静态或非静态,它会有什么不同吗? [复制]
【发布时间】:2012-01-28 19:49:18
【问题描述】:
    static int _i;
    static void Display()
    {
        //operates on _i;
    }

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

在哪些场景中需要具体说明方法的静态非静态性很重要?

编辑;注意:这个问题与许多人似乎回答的静态和非静态方法之间的区别无关。问题是我应该担心差异的场景/用例是什么。为清楚起见,请参阅@ziesemer 的答案,该答案似乎完全解决了这个问题。

【问题讨论】:

  • 变量和函数之间的关系是什么?
  • 是的,它会有所作为。
  • @HenkHolterman 希望我对编辑很清楚
  • 为什么投反对票?因为太文盲? :o
  • 呃,等等,它说“ziesemer 回答了我的问题!”他显然比许多困惑的 SO 贡献者更有洞察力,不要犹豫,将其标记为答案。

标签: c# static-members static


【解决方案1】:

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

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

【讨论】:

  • //但这更多是为了显示清晰的意图而不是性能。//不错的一个..
【解决方案2】:

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

我还会重新审视为什么您对所有事物都使用静态变量,并鼓励您重新审视——而不是让所有事物都成为非静态变量。这将允许您在同一运行时中拥有多个独立的所有实例。通过将变量设置为静态,您实际上是在强制每个人使用相同的配置(或您的变量存储的任何内容)——即使他们创建了包含类的多个实例。

【讨论】:

  • 静态函数也更高效,需要更少的查找来找到它们。但是,性能提升几乎无关紧要。
  • @ziesmer 第一部分是一个不错的答案。我知道第二部分,但有时我们需要为类提供静态字段..
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 2015-03-31
    • 2018-05-15
    • 1970-01-01
    • 2018-11-02
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多