【问题标题】:What's a "static method" in C#?什么是 C# 中的“静态方法”?
【发布时间】:2025-12-15 02:00:01
【问题描述】:

在方法中添加 static 关键字是什么意思?

public static void doSomething(){
   //Well, do something!
}

你能在类中添加static 关键字吗?那是什么意思呢?

【问题讨论】:

  • 您可以使用静态方法而无需创建该类的实例,只需通过 class_name.static_method_name();
  • 在编程级别,我们感觉我们能够调用静态方法而无需创建类/类型的实例。在内部,情况不是。 CLR 在内部管理一个名为 type instance 的特殊实例,用于管理对静态方法的调用。请参阅this 答案。太有趣了。

标签: c# methods static


【解决方案1】:

static 函数与常规 (instance) 函数不同,它不与类的实例相关联。

static 类是只能包含static 成员的类,因此无法实例化。

例如:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

为了调用InstanceMethod,你需要一个类的实例:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

【讨论】:

  • 所以它更像是类方法而不是实例方法?
  • @Moshe:没错。使用静态方法,您不需要类的实例来调用方法,只需要类即可。
  • 但实际上是否存在某种技术限制阻止在实例上调用静态方法?如果编译器允许,那么它被访问的危险是什么?
  • @kroon:这没有任何意义。实例方法实际上只是将一个实例作为隐藏的第一个参数。静态方法没有。见我的博文:blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
  • 其中“StaticMethod”是类方法,“InstanceMethod”是类 SomeClass 的实例方法
【解决方案2】:

静态函数意味着它与类相关联(不是类的特定实例,而是类本身),即使不存在类实例也可以调用它。

静态类是指类只包含静态成员。

【讨论】:

    【解决方案3】:

    static 关键字在应用于类时,会告诉编译器创建该类的单个实例。这样就不可能“新建”一个或多个该类的实例。静态类中的所有方法本身都必须声明为静态的。

    拥有非静态类的静态方法是可能的,而且通常是可取的。例如,当创建另一个类的实例时,工厂方法通常被声明为静态,因为这意味着不需要包含因子方法的类的特定实例。

    有关如何、何时和何地的详细说明,请参阅MSDN

    【讨论】:

    • 不,静态类从不实例化。鉴于其中的所有内容都是静态的,您为什么要想要实例化它?
    • 一个static 类根本没有实例。
    • 对不起,伙计们,我不明白...我说创建了一个实例,你不能新建一个。肯定会创建单个静态实例,否则代码将无法调用?
    • 一个静态类确实有一个实例,实际上有两个,它们只是不是 theType 的实例。一个静态类将作为一个 [Foo] Type 对象(JIT 的方法查找表等)存在于堆上,以及一个用于初始化的特殊 System.Type 对象。
    • 一个类可以声明为静态的,表示它只包含静态成员。无法使用 new 关键字创建静态类的实例。加载包含类的程序或命名空间时,.NET Framework 公共语言运行时 (CLR) 会自动加载静态类。
    【解决方案4】:

    静态变量不与类的对象链接。可以使用类名访问它。类的所有对象都将共享静态变量。

    通过将函数设为静态,它将限制该函数在该文件中的访问。

    【讨论】:

      【解决方案5】:

      即使没有创建类的实例,也可以在类上调用静态方法、字段、属性或事件。如果创建了类的任何实例,则它们不能用于访问静态成员。静态字段和事件只存在一份,静态方法和属性只能访问静态字段和静态事件。静态成员通常用于表示不会响应对象状态而改变的数据或计算;例如,数学库可能包含计算正弦和余弦的静态方法。 静态类成员在成员的返回类型之前使用 static 关键字声明

      【讨论】:

        【解决方案6】:

        很快你就不能实例化静态类: 例如:

        static class myStaticClass
        {
            public static void someFunction()
            { /* */ }
        }
        

        你不能这样:

        myStaticClass msc = new myStaticClass();  // it will cause an error
        

        您只能制作:

        myStaticClass.someFunction();
        

        【讨论】:

          【解决方案7】:

          从另一个角度来看: 考虑您想对单个字符串进行一些更改。 例如你想让字母大写等等。 您为这些操作创建了另一个名为“工具”的类。 创建“Tools”类的实例没有任何意义,因为该类中没有任何类型的实体可用(与“Person”或“Teacher”类相比)。 所以 我们使用 static 关键字来使用“工具”类而不创建任何实例,当您在类名(“工具”)后按点时,您可以访问您想要的方法。

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          using System.Threading.Tasks;
          
          namespace ConsoleApplication1
          {
          class Program
          {
              static void Main(string[] args)
              {
                  Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
                  Console.ReadKey();
              }
          }
          
          public static class Tools
          {
              public static string ToUpperCase(string str)
              {
                  return str.ToUpper();
          
              }
          }
          }
          

          【讨论】:

          • 使用“对字符串进行更改”是一个不好的例子 - 字符串是不可变的,无法更改。但是,否则,解释是有道理的(用非不可变类代替字符串)
          【解决方案8】:

          当您向方法添加“静态”关键字时,这意味着底层实现会为该类的任何实例提供相同的结果。 不用说,结果随着参数值的变化而变化

          【讨论】:

            【解决方案9】:

            static 关键字的核心,您将在 RAM 中只有一个副本(方法 /variable /class ) 这是共享所有通话

            【讨论】:

              最近更新 更多