Как правильно ссылаться на методы. (Ссылка на объект для нестационарного метода) [duplicate]

Я знаю, что люди задавали этот вопрос раньше, но сценарий был слишком специфичным, и я смущен об основных принципах.

У меня есть две базовые версии программы на C #, одна из которых работает, и одна из них не делает. Мне понравилось бы, если бы кто-нибудь мог объяснить, почему я получаю ошибку. Ссылка на объект требуется для нестатического поля, метода или свойства во второй программе.

Works:

namespace Experiments
{
    class Test
    {
        public string myTest = "Gobbledigook";

        public void Print()
        {
            Console.Write(myTest);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test newTest = new Test();
            newTest.Print();
            while (true)
                ;
        }
    }
}

Не работает:

namespace Experiments
{
    class Test
    {
        public string myTest = "Gobbledigook";

        public void Print()
        {
            Console.Write(myTest);
        }
    }

    class Program
    {
        public Test newTest = new Test();

        static void Main(string[] args)
        {
            newTest.Print();
            while (true)
                ;
        }
    }
}

Когда я пытаюсь Ссылка на объект требуется для нестатического поля, метода или свойства текст из класса Test () в вторая программа, это дает мне эту ошибку. Ссылка на объект требуется для нестатического поля, метода или свойства, и я не понимаю, почему. Я вижу, что это связано с тем, где я объявляю экземпляр класса Test (), но я не помню ничего подобного в C ++, поэтому меня это озадачивает.

Что происходит?

3
задан 16 October 2017 в 02:04

2 ответа

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

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

Итак, во второй программе строка инициализации переменной static не выполняется до тех пор, пока у вас не будет какой-либо строки кода вне класса программы, например Program p = new Program();. Решение заключается в том, что вы ставите переменную static, чтобы иметь доступ к ней за пределами статического метода Print (), или вы можете преобразовать свой метод Min () в нестатический режим, который невозможно для метода Main () исключительно.

Если вы хотите определить глобальную переменную, я предлагаю вам определить специальный класс ex MyGlobals:

public class SomeClass
{
    public int x;
}

public class MyGlobals
{
    public static SomeClass mySharedVariable = new SomeClass();

    public SomeClass myGlobalVariable = null;
}

// Usage:
class Program
{
    static void Main(string[] args)
    {
        MyGlobals.mySharedVariable.x = 10; // Shared among all instances
        MyGlobals myGlobal = new MyGlobals(); // New instance of MyGlobals
        myGlobal.myGlobalVariable = new SomeClass(); // New instance of SomeClass
        myGlobal.myGlobalVariable.x = 10; // One instance of MyGlobals including one instance of SomeClass
    }
}
0
ответ дан 15 August 2018 в 16:38
  • 1
    Спасибо, что это полезное объяснение. Это немного отличается от того, как я привык использовать слово static в C ++. Не будет ли обескураживать статическую переменную, так же как и глобальные переменные в C ++? – Simflare 20 October 2016 в 09:37
  • 2
    Я отредактировал свой ответ, чтобы показать способ определения глобальных переменных в C #. Повторите мой ответ. Я надеюсь быть полезной для вас. – Amin 20 October 2016 в 12:37
  • 3
    Спасибо, что нашли время поделиться этим :) – Simflare 20 October 2016 в 13:00

Это не из-за определения класса, это все об использовании ключевого слова static.

Объект newTest класса Test является публичным членом class Program, а main - статическая функция внутри класса программы. и в сообщении об ошибке An object reference is required for the non-static method упоминается оговорка. Итак, вам нужно объявить объект newTest как статический для доступа к ним в статических методах, таких как main.

, как это

 public static Test newTest = new Test();

Дополнительная записка

Учтите, что вы указываете метод Print как static внутри класса Test следующим образом:

 public static void Print()
 {
    Console.Write(myTest);
 }

Тогда вы не можете вызвать метод, как то, что вы в настоящее время используете ([F13]). Вместо этого вы должны использовать Test.Print();, так как статический член не может ссылаться через экземпляр. Вместо этого на него ссылаются через имя типа. Например, рассмотрим следующий класс

3
ответ дан 15 August 2018 в 16:38
  • 1
    Не создает переменную статическую плохую практику, за исключением исключительных обстоятельств, так же, как – Simflare 20 October 2016 в 09:35
  • 2
    продолжение предыдущего - так же, как глобальные переменные обескуражены в C ++? – Simflare 20 October 2016 в 09:36
  • 3
    Спасибо за ваш хорошо продуманный ответ btw :) – Simflare 20 October 2016 в 09:40
  • 4
    Я не думаю, что использование статических переменных - плохая практика, вы можете использовать, если это необходимо. но я не предпочитаю статические переменные в веб-приложениях, так как там есть область применения – sujith karivelil 20 October 2016 в 09:42
  • 5
    ОК. Большое вам спасибо, вы очень помогли :) – Simflare 20 October 2016 в 09:58

Другие вопросы по тегам:

Похожие вопросы: