我一直试图将这个概念用了好几天。我有一个包含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中打印值。请帮忙。
由于 麦克
答案 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);
这很有效,感谢大家的贡献。正是在其他人的评论中,我才能想到这一点。希望我的解决方案对其他人来说很明确。和平。