如何将C#内部类变量设为公开以实现多类共享?
回答你的问题:当然可以,但有更合理的实现方式
首先要明确:你当前代码里的password是Password.Main()方法的局部变量,它的作用域仅限于Main方法内部,所以Username类根本无法访问到它。要让其他类能使用这个密码值,有几种不同的实现思路,我会按推荐程度排序给你讲解:
1. 最直接的方案:通过方法参数传递值
这是最简单也最符合代码设计原则的方式——把密码作为参数传给Username类的方法,不需要任何全局变量或公开字段。
修改你的代码如下:
using System; namespace Project { public static class Password { public static void Main() { Console.WriteLine("Please enter your new password"); string password = Console.ReadLine(); Console.WriteLine("Are you sure you want to change your password to: " + password + "? (Yes/No)"); string input = Console.ReadLine(); if(input.ToLower() == "yes") { Console.WriteLine("Your password has been changed to " + password + "!"); Console.WriteLine("Press any key to continue.."); Console.ReadKey(); Console.Clear(); // 调用Name方法时把password传进去 Username.Name(password); } else if(input.ToLower() == "no") { Console.WriteLine(password + " will not be saved as your password"); Console.WriteLine("Press any key to restart"); Console.ReadKey(); Console.Clear(); Main(); } else { Console.WriteLine("ERROR! Press any key to restart"); Console.ReadKey(); Console.Clear(); Main(); } } } public static class Username { // 修改方法,添加string类型的参数接收密码 public static void Name(string userPassword) { Console.WriteLine("Please enter a username you would like"); string username = Console.ReadLine(); // 汇总展示用户名和密码 Console.WriteLine($"Username: {username} | Password: {userPassword}"); } } }
这种方式的好处是:变量的作用域清晰,不会产生全局状态的副作用,代码可读性和维护性都更好。
2. 使用公开静态字段(适合简单场景,但需谨慎)
如果你确实需要让多个类都能直接访问这个密码值,可以在Password类里定义一个公开的静态字段,这样其他类就能直接引用它。不过要注意:静态字段是全局共享的,多线程环境下可能会有线程安全问题,而且多次调用Main方法时,字段值会被覆盖,所以只适合简单的单线程小项目。
修改后的代码示例:
using System; namespace Project { public static class Password { // 定义公开的静态字段存储密码 public static string CurrentPassword; public static void Main() { Console.WriteLine("Please enter your new password"); // 给静态字段赋值 CurrentPassword = Console.ReadLine(); Console.WriteLine("Are you sure you want to change your password to: " + CurrentPassword + "? (Yes/No)"); string input = Console.ReadLine(); if(input.ToLower() == "yes") { Console.WriteLine("Your password has been changed to " + CurrentPassword + "!"); Console.WriteLine("Press any key to continue.."); Console.ReadKey(); Console.Clear(); Username.Name(); } // 其他逻辑不变... } } public static class Username { public static void Name() { Console.WriteLine("Please enter a username you would like"); string username = Console.ReadLine(); // 直接引用Password类的静态字段 Console.WriteLine($"Username: {username} | Password: {Password.CurrentPassword}"); } } }
3. 更面向对象的方案:封装数据类
如果你的项目后续有扩展需求(比如需要存储更多用户信息),推荐用一个专门的类来封装用户数据,通过对象传递的方式在不同类之间共享信息,这是最符合面向对象设计的方式。
示例代码:
using System; namespace Project { // 封装用户信息的类 public class UserInfo { public string Username { get; set; } public string Password { get; set; } } // 负责处理密码相关逻辑的类 public static class PasswordManager { public static UserInfo GetConfirmedPassword() { Console.WriteLine("Please enter your new password"); string password = Console.ReadLine(); Console.WriteLine($"Are you sure you want to change your password to: {password}? (Yes/No)"); string input = Console.ReadLine(); if(input.ToLower() == "yes") { Console.WriteLine($"Your password has been changed to {password}!"); Console.WriteLine("Press any key to continue.."); Console.ReadKey(); Console.Clear(); return new UserInfo { Password = password }; } else if(input.ToLower() == "no") { Console.WriteLine($"{password} will not be saved as your password"); Console.WriteLine("Press any key to restart"); Console.ReadKey(); Console.Clear(); return GetConfirmedPassword(); } else { Console.WriteLine("ERROR! Press any key to restart"); Console.ReadKey(); Console.Clear(); return GetConfirmedPassword(); } } } // 负责处理用户名相关逻辑的类 public static class UsernameManager { public static void GetUsernameAndDisplay(UserInfo userInfo) { Console.WriteLine("Please enter a username you would like"); userInfo.Username = Console.ReadLine(); Console.WriteLine($"Username: {userInfo.Username} | Password: {userInfo.Password}"); } } // 程序入口类 public static class Program { public static void Main() { var userInfo = PasswordManager.GetConfirmedPassword(); UsernameManager.GetUsernameAndDisplay(userInfo); } } }
这种方式把不同职责拆分到不同类中,代码结构更清晰,后续扩展(比如添加邮箱、手机号等字段)也非常方便。
总结一下:直接公开内部变量(比如静态字段)是可行的,但更推荐用方法参数传递或封装数据类的方式,这样代码更健壮、更易维护。
内容的提问来源于stack exchange,提问作者Dubstepzedd
相关产品推荐
相关产品推荐

