为什么静态方法只允许调用静态方法而不是非静态方法

时间:2011-10-20 14:12:58

标签: c# .net oop static-methods

  

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

当我试图从静态方法中调用普通方法时,我得到了错误:

  

非静态字段,方法或属性

需要对象引用

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

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

例如:

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

5 个答案:

答案 0 :(得分:6)

静态方法可以调用实例方法 - 但是你需要有一个实例来调用它们。这个实例来自哪里并不重要,例如:

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;

......这更有意义。

通常,实例方法使用或修改实例的 state

答案 1 :(得分:4)

以这种方式考虑。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

因为没有实例来调用该方法。你应该创建另一个类并测试它:

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;
    }
}

答案 4 :(得分:0)

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

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

静态方法没有this对象,也无法调用实例方法,因为它没有以隐形方式为this传递任何内容......

听起来像个笑话,但这是我看到它的方式:)