Почему нельзя вызывать нестатический метод из статического метода? - PullRequest
5 голосов
/ 10 июня 2010

В моем классе есть статический метод [Method1], который вызывает другой метод [Method2] в том же классе и не является статическим методом.Но это нет-нет.Я получаю эту ошибку:

Ссылка на объект требуется для нестатического поля, метода или свойства "ClassName.MethodName ()"

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

Ответы [ 8 ]

24 голосов
/ 10 июня 2010

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

2 голосов
/ 10 июня 2010

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

1 голос
/ 10 июня 2010

Вам нужен экземпляр класса class для вызова нестатического метода.Вы можете создать экземпляр ClassName и вызвать Method2 следующим образом:

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

    public void Method2()
    {
        //dostuff
    }
}

Ключевое слово static в основном помечает метод как вызываемый, ссылаясь только на его тип [ClassName].На все нестатические методы необходимо ссылаться через экземпляр объекта.

1 голос
/ 10 июня 2010

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

На самом деле вы пытаетесь это сделать. Обратите внимание на объект this в Method1. У вас нет this доступных в статических методах.

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

void Method2() { }
0 голосов
/ 27 февраля 2018

Статические члены могут получить доступ только к другим статическим членам класса напрямую, а статический метод не может получить доступ к нестатическим членам того же класса напрямую.

Статический метод или свойство могут напрямую вызывать только другие статические методы или свойства того же класса (т.е. используя само имя метода) и могут напрямую манипулировать только статическими переменными в том же классе.

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

Многие объекты класса, каждый со своими собственными копиями переменных экземпляра, могут существовать одновременно. Предположим, что статический метод должен вызывать нестатический метод напрямую. Как бы метод узнал, какими переменными экземпляра объекта манипулировать? Что произойдет, если в момент вызова нестатического метода не было объектов этого класса? Источник

0 голосов
/ 15 декабря 2014

Сначала необходимо создать экземпляр класса для вызова нестатического метода или функций.

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();
0 голосов
/ 10 июня 2010

Статическому методу по определению не предоставляется доступ к this.Следовательно, он не может вызвать метод-член.

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

0 голосов
/ 10 июня 2010

Потому что «статический» метод - это то, что известно как «метод класса».То есть вы отправляете объекту одним из двух способов на языке класса, таком как C #, по классу или по экземпляру.нестатические элементы могут быть отправлены другими нестатическими элементами, и наоборот, статические члены могут вызываться только из других статических элементов.

Имейте в виду, что вы можете получить один из другого с помощью "новый »механизм, или наоборот.

...