【问题标题】:Why Static Methods are allowed only to call static methods not non static methods [duplicate]为什么静态方法只允许调用静态方法而不是非静态方法[重复]
【发布时间】:2011-12-11 20:13:03
【问题描述】:

可能重复:
Why can I only access static members from a static function?

当我尝试从静态方法中调用普通方法时,出现错误:

非静态字段、方法或属性需要对象引用

所以这意味着我需要创建类的对象,然后调用非静态方法。如果我想直接调用该方法,那么我必须将该方法声明为静态。

但是,在这种情况下,调用方法和被调用方法属于同一个类。那么为什么我需要在从静态方法调用时创建对象,而我可以从非静态方法调用非静态方法。

例如:

class Program
    {
        //public void outTestMethod(int x,out int y)
        //{
        //    y = x;
        //}
        static void Main(string[] args)
        {
            int a = 10;
            int b = 100;

            outTestMethod(a,out b); 
        }

        private  void outTestMethod(int x, out int y)
        {
            y = x;
        }
    }

Error:An object reference is required for the non-static field, method, or property

【问题讨论】:

  • 在您的示例中,您只需执行 private static void outTestMethod 即可。你不需要像你说的那样“创建一个对象”。
  • 这个错误的意思正是它所说的;非静态(实例)方法可以访问 Program 实例的成员(此特定示例没有任何成员),而静态方法只能访问静态成员(因为它没有要引用的实例。)这是因为它是可能的拥有一个类的多个实例。

标签: c# .net oop static-methods


【解决方案1】:

静态方法可以调用实例方法——但你需要有一个实例来调用它们。该实例来自何处并不重要,例如:

int a = 10;
int b = 100;
Program program = new Program();
program.outTestMethod(a,out b);

实例方法与该类型的特定实例相关联,而静态方法则与整个类型相关联——其他类型的成员也是如此。所以要调用一个实例方法,你需要知道哪个你感兴趣的实例。例如,它没有意义:

string name = Person.Name;

因为你需要知道你说的是哪个人:

Person person = FetchPersonFromSomewhere();
string name = person.Name;

...这更有意义。

典型的实例方法使用或修改实例的状态

【讨论】:

    【解决方案2】:

    这样考虑。

    静态方法是电梯外的按钮。任何人都可以看到它并推动它,并使某些事情发生(即其中一部电梯将到达该楼层)。

    非静态方法是特定电梯内的按钮。他们操纵那部电梯(而不是其他人)。

    【讨论】:

    • 这太棒了!当我需要解释静态方法时,我实际上会使用它
    【解决方案3】:

    非静态方法也称为实例方法。这意味着(通常)有一大块数据,特定于该方法操作的实例(对象)。

    您不能从静态方法调用非静态或实例方法,因为它不知道要操作哪个实例或对象。

    【讨论】:

      【解决方案4】:

      因为没有实例可以从中调用方法。您应该创建另一个类并对其进行测试:

      class Program
      {
          static void Main(string[] args)
          {
              int a = 10;
              int b = 100;
              Test testclass = new Test();
              testclass.outTestMethod(a,out b); 
          }
      }
      
      class Test
      {
      
          public void outTestMethod(int x, out int y)
          {
              y = x;
          }
      }
      

      【讨论】:

        【解决方案5】:

        你了解实例方法和静态方法的区别吗?

        一个实例方法可以访问this对象,即使它没有作为参数传入,实际上它就像是一个不可见的参数,与框架传递给你的类的类型相同。

        静态方法没有 this 对象并且不能调用实例方法,因为它没有任何东西可以以不可见的方式传递给 this...

        听起来像个笑话,但我是这样看的:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-27
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          相关资源
          最近更新 更多