-1

几天来,我一直在努力解决这个概念。我有一个包含 3 个类的控制台程序:

1) 主程序
2) 创建登录屏幕
3) 实际登录屏幕

这是代码:

class Program
{
    static void Main(string[] args)
    {           
       //Instantiate Main Menu
        Menu myMenu = new Menu();
        myMenu.mainMenu();

        //testing global values
        Login myLogin = new Login();
        Console.Write("The new Login is ");
        Console.WriteLine(myLogin.newLogin);

        //Pause
        Console.WriteLine("Press Any Key...");
        Console.ReadLine();
    }
}

class Menu
{         
    public void mainMenu()
    {          
        // [create menu that prints choices on the screen]
        start:
        Console.Clear();
        Console.WriteLine("PLEASE CHOOSE AN OPTION");
        Console.WriteLine();
        Console.WriteLine("[1] LOGIN \n[2] CREATE LOGIN");
        Console.WriteLine();
        Console.Write("> ");

        string menuChoice = Console.ReadLine();

        // [switch/case for Main Menu]
        switch (menuChoice) 
        {
            case "1":
                Console.WriteLine("You chose 1");
                break;
            case "2":                    
                // [instantiate createLogin]
                Login myLogin = new Login();                        
                myLogin.createLogin(); 
                Console.WriteLine(myLogin.newLogin);
                break;
            default:
                Console.WriteLine("INVALID OPTION... TRY AGAIN.");
                System.Threading.Thread.Sleep(5000);
                goto start;

        }
}

class Login
{
    // [empty containers for newLogin & newPass]
    public string newLogin { get; set; }
    public string newPass { get; set; }

    public void createLogin()
    {
        // [display new login screen & assign newLogin & newPass]
        Console.Clear();
        Console.WriteLine("CREATE NEW LOGIN");
        Console.WriteLine();
        Console.Write("LOGIN: ");
        newLogin = Console.ReadLine();
        Console.Write("PASSWORD: ");            
        newPass = Console.ReadLine();

        // [instantiate & return to main menu]
        Menu myMenu = new Menu();
        myMenu.mainMenu();
    }
}

现在,当我尝试从主程序输出代码时,值为空。我在这里有错误的结构吗?我真的不需要存储多个登录名并通过(目前),因此此时不需要数组,但我肯定会在以后学习。我是自学的,所以我尽量让事情变得简单,直到我确定这个概念。

我想存储 newLogin 和 newPass 并在 main.xml 中打印值。请帮忙。

谢谢迈克

4

3 回答 3

1

在这段代码中:

 .....
 case "2":                    
   // [instantiate createLogin]
   Login myLogin = new Login();
   Console.WriteLine(myLogin.newLogin);  //WRITE TO CONSOLE
   myLogin.createLogin();                // QUERY AFTER WRITE
 ......

首先编写一个空登录,然后只查询它。因此,您在屏幕上看不到任何登录信息是“正常的”,因为它是在初始化之前打印的,之后再也没有打印过。

要解决此问题,只需反转函数调用:

 .....
 case "2":                    
   // [instantiate createLogin]
   Login myLogin = new Login();       
   myLogin.createLogin();                // QUERY 
   Console.WriteLine(myLogin.newLogin);  //WRITE TO CONSOLE
 ...

编辑

如果您想操作 over Login,可能的解决方案之一是:

class Menu
{
    private Login _login = new Login(); // EVERYWHERE IN MENU USE THIS FIELD, THE SAME INSTANCE

.....
 case "2":                    
   // [instantiate createLogin]
   //Login myLogin = new Login();        NO MORE NEW INSTANCE BUT USE ALREADY AVAILABLE ONE
   _login.createLogin();                // QUERY 
   Console.WriteLine(_login .newLogin);  //WRITE TO CONSOLE
 ...

}
于 2013-01-31T16:09:01.870 回答
0

您确定它在 Main() 中显示为 null 吗?您还在myLogin.newLogin菜单开关/外壳中打印。当您在菜单中打印它时,您会在调用 myLogin.createLogin() 之前打印它,因此它应该为空,但是当它返回到 Main() 时,它应该被正确设置。

于 2013-01-31T16:11:49.273 回答
0

我找到了答案。它可能不是最好的,但它确实有效。一旦我纠正了查询/写入问题(如上所列),我开始更多地考虑实例,并意识到通过创建新实例我实际上是在清除数据。对不起上限,但我的目的是帮助其他一些自学者。

好的,所以理论上我想在案例中调用 createLogin 方法后保留它。我该如何保留它?我将 createLogin、newLogin 和 newPass 类设为静态,以便可以分配值,然后可以从 main 调用该类。通过调用它而不实例化它,它保持分配的值。

class Login
    {
    // [empty containers for newLogin & newPass]
    public static string newLogin { get; set; }
    public static string newPass { get; set; }

public static void createLogin()
{           
    // [display new login screen & assign values]
    Console.Clear();
    Console.WriteLine("CREATE NEW LOGIN");
    Console.WriteLine();
    Console.Write("LOGIN: ");
    newLogin = Console.ReadLine();
    Console.Write("PASSWORD: ");            
    newPass = Console.ReadLine();

    // [instantiate & return to main menu]
    //Menu myMenu = new Menu();
    //myMenu.mainMenu();
} 

主要是:

//testing global values            
            Console.Write("The new Login is ");                  
            Console.WriteLine(Login.newLogin);

这工作,感谢大家的贡献。正是在其他人的评论中,我才能够弄清楚这一点。希望我的解决方案对其他人来说是清楚的。和平。

于 2013-02-01T16:03:25.087 回答