代码之家  ›  专栏  ›  技术社区  ›  sam

通过out forms创建全局变量

  •  -1
  • sam  · 技术社区  · 7 年前

    userName 我搜索并得出以下代码

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

    public static class globals
    {
        public static string userName { get; set; }
    }
    

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

    Checks.globals.userName = TB_USER_NAME.Text;
    

    • 我是否必须将属性用户名设置为受保护的或是私有的?

      public static string userName { get; private set; }
      
    • 有什么更好的办法吗?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Eric Lippert    7 年前

    我正在尝试保存用户名和一些其他信息作为全局变量通过所有的windows窗体从登录窗体开始像username

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

    如果你一心想使用全局变量,那是正确的方法。但你应该遵循C标准并称之为 Globals globals

    类似地:

    public static string userName { get; set; }
    

    应该是的 UserName ,不是 userName .

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

    Checks.globals.userName = TB_USER_NAME.Text;
    

    Checks.Globals.UserName = UserNameTextBox.Text;
    

    我是否必须将属性用户名设置为受保护的或是私有的?

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

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

    在第一次初始化之后,该值是否不会再次设置?

    它将设置为您设置的次数。 这就是全球政府的意思,也是为什么这是个坏主意 . 现在你必须确保你的程序只设置一次这个值,如果这是你想要的,你必须确保 在你的节目里。这就是为什么全局状态不利于可维护性:因为它会将可接受局部分析的问题变成需要整个程序分析的问题。

    如果您想检测全局状态被多次设置的bug,那么make 全局状态:需要全局状态为“我的全局状态已设置一次”。你可以查一下 那个

    有什么更好的办法吗?

    对。放弃需要您维护全局状态的架构。在实例变量中维护状态。

        2
  •  1
  •   D-Shih    7 年前

    我是否必须将属性用户名设置为受保护的或是私有的?

    如果您将属性userName设置为protected或private,则无法通过属性设置值。

    取决于你的逻辑,需要谨慎,因为它是一个全球性的价值观。

    有什么更好的办法吗?

    Singleton_pattern 执行全局对象。

    当只需要一个对象来协调整个系统的操作时,这很有用。这个概念有时被推广到只有一个对象存在时操作更高效的系统,或者将实例化限制为特定数量的对象的系统

    public class Globals
    {
        private static Globals _obj;
        public static Globals Current {
            get {
                if (_obj == null)
                    _obj = new Globals();
                return _obj;
            }
        }
        private Globals() { }
    
        private string _username;
    
        public string UserName { get { return _username; } }
    
        public void SetUserName(string userName) {
            this._username = userName;
        }
    }
    

    你可以用 Globals.Current 获取全局对象。 UserName SetUserName 方法。

    Globals.Current.SetUserName("test"); //set the username
    Globals.Current.UserName; // get the username
    
        3
  •  1
  •   Rufus L    7 年前

    听起来你在问,“我怎么能强制一个变量只设置一次呢?”。如果是这样,您可以创建一个后备字段来存储值,并在属性中 set 方法可以首先检查后台字段是否 null . 如果是,则设置值,如果不是,则不执行任何操作。以这种方式,仅设置一次背景字段:

    private static string _username = null;
    
    public static string UserName
    {
        get { return _userName; }
        set { if (_username == null) _username = value; }
    }
    

    setter private,并提供不同的方法来设置值。这是一个奇怪的设计,但它确实使 UserName 属性只读,这将防止意外赋值(这会导致编译时错误)。

    例如:

    // UserName is a Read-Only property; it can't be assigned a value directly
    public static string UserName { get; private set; }
    
    // Anyone can change UserName here, but they have to intentionally call this method to do so
    public static void SetUserName(string userName)
    {
        UserName = userName;
    }