通过表单创建全局变量

sam*_*sam -1 c# .net-4.0

我试图通过所有窗口表单保存用户名和一些其他信息作为全局变量从登录表单开始,像userName我搜索并提出下面的代码

首先,我创建单独的类globals,如下所示

public static class globals
{
    public static string userName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我在登录成功时设置该变量,如下所示

Checks.globals.userName = TB_USER_NAME.Text;
Run Code Online (Sandbox Code Playgroud)

几个问题

  • 我必须使属性userName受保护或可能是私有的吗?

    public static string userName { get; private set; }
    
    Run Code Online (Sandbox Code Playgroud)
  • 首次初始化后,该值是否会再次设置?

  • 还有什么比这更好的了吗?

Eri*_*ert 5

我试图通过从登录表单(如userName)开始的所有窗体表单将用户名和其他一些信息保存为全局变量

这在C#中被认为是一种糟糕的编程习惯.依赖于全局状态会使您的程序更难以推理和更难修改.

考虑另一种方法; 如果程序中有很多需要访问相同信息的类实例,那么它们都可以保持对状态对象的引用,而不是引用全局状态.

首先,我创建一个名为globals的单独类,如下所示

如果你一直在努力使用全局变量,这是正确的方法.但是你应该按照C#标准来调用它Globals,而不是globals.

同理:

public static string userName { get; set; }
Run Code Online (Sandbox Code Playgroud)

应该是UserName,而不是userName.

然后我在登录成功时设置该变量,如下所示

Checks.globals.userName = TB_USER_NAME.Text;
Run Code Online (Sandbox Code Playgroud)

再次,使用适当的C#命名约定.我们不在C#中使用SHOUTING_SNAKES_EVERYWHERE.

Checks.Globals.UserName = UserNameTextBox.Text;
Run Code Online (Sandbox Code Playgroud)

我必须使属性userName受保护或可能是私有的吗?

你不能保护它; 这是一个静态的课程!受保护意味着派生类可以访问,从静态类派生是非法的.

将其设为私有将使其无法从课外进入,这与您想要的相反.

所以,不,不要那样做.你能解释为什么你认为这可能是一个好主意吗?因为你有一些应该被消除的错误信念.

首次初始化后,该值是否会再次设置?

它将设置为您设置的次数. 这就是全球国家意味着什么,以及为什么这是一个坏主意.现在你必须确保你的程序只设置一次值,如果这是你想要的,你必须在程序中全局确保.这就是为什么全球状态对可维护性不利的原因:因为它将需要本地分析的问题转化为需要整个程序分析的问题.

如果要检测多次设置全局状态的错误,则创建更多全局状态:您需要全局状态"我的全局状态已设置一次".然后,您可以检查该集上的状态,如果多次设置该程序,则会使程序崩溃.或者忽略第二组,或者其他什么,如果你喜欢隐藏你的错误而不是修复它们.

还有什么比这更好的了吗?

是.放弃要求您维护全局状态的架构.在实例变量中维护状态.