2013-09-17 4 views
0

Я изучаю C#, и у меня возникают проблемы с переменной областью в моей простой консольной программе.Проблемы с переменной областью C#

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

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

Мне просто нужно подтолкнуть в правильном направлении, надеюсь кто-то может помочь!

Сообщение об ошибке я получаю это:

Ошибка 1 Ссылка на объект необходим для не-статическое поле, метод или свойство 'ConsoleApplication2.Program.game()'

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    public class Program 
    { 
     int numberToGuess; 
     int numberGuessed; 
     int triesRemaining; 

     public void game() 
     { 
      Console.WriteLine("   ==Welcome to Guess My Number== \n"); 
      Console.WriteLine("Player 1: Please enter your number to guess between 1 and 20: \n"); 
      numberToGuess = int.Parse(Console.ReadLine()); 
      Console.WriteLine("Player 2, please enter your first guess, you have 7 tries: \n"); 
      numberGuessed = int.Parse(Console.ReadLine()); 

      if (numberGuessed == numberToGuess) 
      { 
       correct(); 
      } 
      else 
      { 
       incorrect(); 
      } 

     } 

     public void correct() 
     { 
      Console.WriteLine("Congratulations, the number was in fact " + numberToGuess); 
     } 

     public void incorrect() 
     { 

     } 


     static void Main(string[] args) 
     { 
      game();    
     } 
    } 
} 
+0

Ваш Основной метод - статический метод, другие - не статические. добавить статику в varibles/method будет хорошо. – sheauren

+1

Я бы хотел, чтобы это не было приостановлено, честно говоря, это так ясно, как может быть то, с чем вы боретесь. Я подробно рассказал о вашей проблеме и о том, как ее решить, но суммировать ее в форме комментариев, чтобы я мог ее получить, теперь существенно меняется: 'game();' to 'new Program(). Game(); 'и ваша программа должна функционировать правильно. –

+0

Спасибо, это сработало отлично! Теперь мне просто нужно выяснить, зачем нужна программа(). Я знаю, что сейчас ухожу за свое понимание, но просто хочу попробовать этот вызов, пока я работаю через свой учебник. –

ответ

4

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

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

Итак, если у Вас нет класс:

class Foo 
{ 
    public static int Alpha { get ; set ; } 
    public  int Bravo { get ; set ; } 
} 

Независимо от того, как будут созданы многие экземпляры вашего Foo класса есть только один экземпляр Alpha. Любой метод или свойство экземпляра могут обращаться к статическому элементу напрямую.

Элементы экземпляра, поскольку они существуют на для каждого экземпляра basic, требуют, чтобы экземпляр объекта ссылался на них. Если добавить некоторые методы в Foo класс:

public static int DoSomething() 
{ 
    return Alpha * 3 ; 
} 

вполне допустимо — метод является статическим и элемент является статическим. То же самое для метода экземпляра:

public int DoSomethingElse() 
{ 
    return Alpha * 3 ; 
} 

Что-то вроде этого не получится:

public static int AndNowForSomethingCompletelyDifferent() 
{ 
    return Alpha * 3 + Bravo ; 
} 

Bravo нельзя ссылаться здесь без ссылки к экземпляру Foo. Это будет работать, однако:

public static int AndNowForSomethingCompletelyDifferent(Foo instance) 
{ 
    return Alpha * 3 + instance.Bravo ; 
} 

Как будет это:

public int AndNowForSomethingCompletelyDifferent() 
{ 
    return Alpha * 3 + Bravo ; 
} 

Поскольку метод не является статическим (метод экземпляра), он имеет неявную ссылку (this) к его экземпляру Foo.Выше в точности эквивалентно

public int AndNowForSomethingCompletelyDifferent() 
{ 
    return Alpha * 3 + this.Bravo ; 
} 

В вашем случае, вы можете создать экземпляр класса Program в методе Main():

public static void Main(string[] args) 
{ 
    Program p = new Program() ; 
    p.game() ; 
    return ; 
} 

Или вы могли бы отметить ваши методы game(), correct() и incorrect() как static, просто как маркируется Main().

Надеюсь, это поможет!

+0

Объяснение SuperB для вечно запутанных существ, таких как я ... спасибо –

+0

Отлично! Очень хорошо объяснили! Я продолжал закончить программу, но я собираюсь экспериментировать со множеством функций и подталкивать себя, насколько могу! Thankyou! –

0

static методы/поля относятся к пользовательскому типу, а не к экземпляру.

Например, если вы посмотрите на этот кусок кода:

public class MyClass 
{ 
    public static void Foo() 
    { 
    } 
} 

метода Foo(), не доступен из экземпляра MyClass. Так как это static, вы получаете доступ к нему из пользовательского типа. Пример:

public class Program 
{ 
    static void Main(String[] args) 
    { 
     MyClass.Foo(); 
    } 
} 

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

В вашем коде метод game() и поля/методы, вызываемые/вызываемые игрой, не являются static, поэтому вы можете получить доступ к нему только через экземпляр объекта. Конечно, создание game() и всех других полей/методов static приведет к созданию рабочего кода.

Для получения дополнительной информации о типах static, смотрите здесь: http://msdn.microsoft.com/en-us/library/98f28cdx.aspx

0

я пошел на, чтобы завершить методы и это, кажется, работает отлично!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
public class Program 
{ 
    int numberToGuess; 
    int numberGuessed; 
    int triesRemaining = 7; 
    string playAgain; 
    string player1, player2; 

    public void game()                            //Initiates the game instance 
     { 
      Console.WriteLine("   ==Welcome to Guess My Number== \n"); 
      Console.WriteLine(" Player 1, Please enter your name: \n"); 
      player1 = Console.ReadLine(); 
      Console.Clear(); 
      Console.WriteLine("      ==Guess My Number== \n"); 
      Console.WriteLine("Hello " + player1 + " : Please enter your number to guess between 1 and 20: \n"); 
      numberToGuess = int.Parse(Console.ReadLine()); 
      Console.Clear(); 
      Console.WriteLine("   ==Guess My Number== \n"); 
      Console.WriteLine(" Player 2, Please enter your name: \n"); 
      player2 = Console.ReadLine(); 
      Console.Clear(); 
      Console.WriteLine("Hello " + player2 + " please enter your first guess, you have 7 tries: \n"); 
      numberGuessed = int.Parse(Console.ReadLine()); 

      if (numberGuessed == numberToGuess) 
      { 
       Console.WriteLine("Congratulations, the number was in fact " + numberToGuess); 
       newGame(); 
      } 
      else 
      { 
       incorrect(); 
      } 

     } 

    public void incorrect()                           //Method for dealing with incorrect answers 
    { 
     for (int x = 0; x < 6; x++) 
     { 
      triesRemaining--; 
      Console.WriteLine("Incorrect, you have " + triesRemaining + " tries remaining \n"); 
      Console.WriteLine(player2 + ", please enter your next guess: \n"); 
      numberGuessed = int.Parse(Console.ReadLine()); 

      if (numberGuessed == numberToGuess) 
      { 
       Console.WriteLine("Congratulations, the number was in fact " + numberToGuess); 
       newGame(); 
      } 
      else { 
       //Do nothing 
      } 

     } 

     Console.WriteLine("You have used up all your tries! You have failed. The number was: " +numberToGuess + "\n"); 
     newGame(); 
    }              //Method for dealing with incorrect answers 

    public void newGame()                           //Method that gives the user the option to start a new game instance 
    { 
     Console.WriteLine("Would you like to play again? Type yes or no: \n"); 
     playAgain = Console.ReadLine(); 
     playAgain = playAgain.ToLower(); 
     if (playAgain == "yes") 
     { 
      Console.Clear(); 
      game(); 
     } 
     else if (playAgain == "y") 
     { 
      game(); 
     } 
     else 
     { 
      //Do nothing 
     } 
    }               

    static void Main(string[] args) 
    { 
     new Program().game(); 

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