2011-10-20 11 views
3

Possible Duplicate:
Why can I only access static members from a static function?Почему статические методы могут только вызывать статические методы не удобства статические методы

В то время как я пытался вызвать обычный метод внутри статического метода я получил ошибку:

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

Так что это означает, что мне нужно создать объект класса, а затем вызвать нестатический метод. Если я хочу вызвать метод напрямую, я должен объявить этот метод как Static.

Но в этом случае метод вызова и вызываемый метод принадлежат одному классу. Так почему мне нужно создать объект при вызове из статического метода, в то время как я могу вызвать нестатический метод из нестатического метода.

Ex:

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

+0

В вашем примере вы можете просто сделать 'private static void outTestMethod', и он будет работать. Вам не нужно «создавать объект», как вы сказали. – Icarus

+0

Ошибка означает то, что она говорит; нестатический (экземпляр) метод может обращаться к членам экземпляра программы (в этом конкретном примере их нет), тогда как статический метод может получить доступ только к статическим членам (поскольку у него нет экземпляра для ссылки.) Это связано с тем, что это возможно иметь несколько экземпляров класса. –

ответ

6

Статические методы можете методы экземпляра вызов - но вы должны иметь экземпляр, на котором называть их. Не имеет значения, где этот экземпляр происходит из частности, так, например:

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

Методы экземпляра ассоциируются с конкретным экземпляром типа, в то время как статические методы связаны с общим типом вместо - и то же самое true для других членов. Таким образом, чтобы вызвать метод экземпляра, вы должны знать, который экземпляр интересующего вас, например, было бы бессмысленно иметь:.

string name = Person.Name; 

, потому что вы должны знать которые человека, которому вы разговоры о:

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

... это имеет смысл.

Обычно методы экземпляра используют или изменяют состояние состояния экземпляра.

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

Нестатический метод также называется методом экземпляра. Это означает, что там (обычно) есть фрагмент данных, специфичный для экземпляра (объекта), в котором работает этот метод.

Вы не можете вызвать нестатический или экземплярный метод из статического метода, потому что он не будет знать, к какому экземпляру или объекту будет работать.

4

Рассматривайте это так.

Статический метод - это кнопка за пределами лифта. Любой может увидеть это и нажать на него, и что-то произойдет (т. Е. Один из лифтов придет на этот этаж).

Нестатические методы - это кнопки внутри конкретного лифта. Они манипулируют этим лифтом (и ни с кем другим).

0

Вы понимаете разницу между методом экземпляра и статическим методом?

метод экземпляра имеет доступ к объекту this, даже если он не передан как параметр, на самом деле это похоже на то, что он был невидимым параметром того же типа класса, переданного для вас фреймворком.

статический метод не имеет, что this объекта и не может вызывать методы экземпляра, потому что он не имеет ничего, чтобы пройти для этого this в невидимом пути ...

звучит как шутка, но это, как я см. это:

Смежные вопросы