从方法中调用2个输入值

时间:2013-01-31 16:05:19

标签: c# oop

我一直试图将这个概念用了好几​​天。我有一个包含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();
    }
}

现在,当我尝试从主程序输出代码时,该值为null。我这里有错误的结构吗?我真的不需要存储多个登录并传递(现在),所以此时不​​需要数组,但我肯定会在路上学习。我是自学,所以我想尽可能地保持简单,直到我指出这个概念。

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

由于 麦克

3 个答案:

答案 0 :(得分:1)

在此代码中:

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

首先编写一个emtpy登录,并在仅查询之后。所以你在scree上没有看到任何登录信息是“正常的”,因为它在之前打印并且从未再次打印之后

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

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

编辑

如果您希望在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
 ...

}

答案 1 :(得分:0)

你确定它在Main()中显示为null吗?您还在菜单开关/案例中打印myLogin.newLogin。当你在菜单中打印它时,你在调用myLogin.createLogin()之前打印它所以它应该为null,但是当它返回Main()时它应该被正确设置。

答案 2 :(得分: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);

这很有效,感谢大家的贡献。正是在其他人的评论中,我才能想到这一点。希望我的解决方案对其他人来说很明确。和平。