【问题标题】:Why can't you call a non-static method from a static method?为什么不能从静态方法调用非静态方法?
【发布时间】:2011-03-02 08:31:59
【问题描述】:

我的类中有一个静态方法[Method1],它调用同一个类中的另一个方法[Method2],不是静态方法。但这是一个禁忌。我收到此错误:

需要一个对象引用 非静态字段、方法或 属性“ClassName.MethodName()”

有人可以简单描述一下原因吗?包括其他可能与此相关的事情。

【问题讨论】:

标签: c# class static-methods


【解决方案1】:

非静态方法需要类的实例。除非您传入了一个实例,或者在您的方法中创建了一个实例,否则您不能调用非静态方法,因为您不知道该方法应该操作的类的哪个实例。

【讨论】:

    【解决方案2】:

    在静态方法中,您没有该类的实例。所以在没有实例存在的情况下,不可能在实例上调用实例方法。

    【讨论】:

      【解决方案3】:

      为了调用非静态方法(即实例方法),您必须先拥有该方法的对象实例,然后才能调用所述方法。

      你实际上想要做的是这个。请注意 Method1 中的 this 对象。您在静态方法中没有可用的 this

      static void Method1() {
         this.Method2()
      }
      
      void Method2() { }
      

      【讨论】:

        【解决方案4】:

        你需要一个类的实例来调用非静态方法。您可以创建一个 ClassName 实例并像这样调用 Method2:

        public class ClassName
        {
            public static void Method1()
            {
                ClassName c = new ClassName();
                c.Method2();
            }
        
            public void Method2()
            {
                //dostuff
            }
        }
        

        static 关键字基本上通过仅引用其类型 [ClassName] 将方法标记为可调用的。所有非静态方法都必须通过对象的实例来引用。

        【讨论】:

          【解决方案5】:

          因为“静态”方法就是所谓的“类方法”。也就是说,您可以在 C# 等基于类的语言中按类或按实例两种方式之一分派对象。非静态成员可以被其他非静态成员分派,相反,静态成员只能被其他静态成员调用。

          请记住,您可以通过“新”机制从另一个访问另一个,反之亦然。

          【讨论】:

            【解决方案6】:

            根据定义,静态方法不提供对this 的访问。因此,它不能调用成员方法。

            如果您尝试从静态方法调用的成员方法不需要this,则可以将其更改为静态方法。

            【讨论】:

              【解决方案7】:

              首先你需要创建类的实例以便调用非静态方法或函数。

              public class ClassHelper()
              {
                 public static ClassHelper GetInstance()
                  {
                      ClassHelper instance = null;
              
                      if (System.Web.HttpContext.Current == null)
                      {
                          instance = new ClassHelper();
                          return instance;
                      }
              
                      if (System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"] == null)
                      {
                          instance = new ClassHelper();
                          System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"] = instance;
                      }
              
                      instance = (ClassHelper)System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"];
              
                      return instance;
                  }
              
              
                 public string Test()
                 {
                     return "test123";
                 }
              
              }
              

              那么就可以如下调用函数了:

              textBox1.Text = ClassHelper.GetInstance().Test();
              

              【讨论】:

                【解决方案8】:

                静态成员只能直接访问该类的其他静态成员,静态方法不能直接访问同一类的非静态成员。

                静态方法或属性只能直接调用同一类的其他静态方法或属性(即单独使用方法名称),并且只能直接操作同一类中的静态变量。

                要访问类的非静态成员,静态方法或属性必须使用对该类对象的引用。回想一下,静态方法与整个类相关,而非静态方法与类的特定对象(实例)相关联,并且可以操纵该对象的实例变量(以及类的静态成员)。

                一个类的许多对象,每个对象都有自己的实例变量副本,可能同时存在。假设一个静态方法要直接调用一个非静态方法。该方法如何知道要操作哪个对象的实例变量?如果在调用非静态方法时不存在类的对象会发生什么? Source

                【讨论】:

                  【解决方案9】:

                  简单的经验法则是:

                  静态方法/类/ctor可以永远 [使用/调用/调用/你到底是什么 命名动词] 调用非静态字段、属性或方法。但是,通过调用 实例化

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2010-09-29
                    • 2023-02-22
                    • 2011-12-11
                    • 1970-01-01
                    • 2012-07-02
                    • 2016-10-04
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多