Я знаю, что люди задавали этот вопрос раньше, но сценарий был слишком специфичным, и я смущен об основных принципах.
У меня есть две базовые версии программы на 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 ++, поэтому меня это озадачивает.
Что происходит?
В первой программе вы создали новый экземпляр внутри статического метода. Внутри этого метода все нормально.
Но если вы хотите вызвать некоторые методы или получить доступ к некоторым переменным вне статических методов, вам нужно, чтобы они были статическими. Причина в том, что когда вы вызываете статический метод, экземпляр класса не создается, и поэтому экземпляр нестатических переменных еще не создан, и у вас нет доступа к ним!
Итак, во второй программе строка инициализации переменной 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
}
}
Это не из-за определения класса, это все об использовании ключевого слова 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();, так как статический член не может ссылаться через экземпляр. Вместо этого на него ссылаются через имя типа. Например, рассмотрим следующий класс