C#使用返回变量而不是全局变量

时间:2015-12-29 17:52:06

标签: c# visual-studio visual-studio-2015 global-variables return-value

请注意我使用Visual Studio 2015创建Excel VSTO。关于全局变量,我有很多问题。在大多数情况下,我一直试图避免它们(因为"全局变形很糟糕"),但同样尊重我也看到人们说使用全局变量并不坏如果你正确使用它们。

假设以下类结构 -

 1    public class ribbon {  //Class containing Ribbon button to activate
 2        private void button_click(){
 3            Globals.ThisAddIn.openUI();
 4        }
 5    }
 6    
 7    public class formClass {  //Class containing the user  form that will be used
 8        private void button_click(){
 9            Globals.ThisAddIn.setProperties(this.field1.Value, this.field2.Value);
10            Globals.ThisAddIn.runFunction();
11        }
12    }
13    
14    public class ThisAddIn {
15        struct someProperties {
16            public string foo;
17            public string bar;
18        }
19    
20        someProperties ps = new someProperties();
21        formClass ui = new formClass();
22    
23        public void openUI(){
24            ui.showDialog();
25        }
26    
27        public void setProperties(string field1, string field2){
28            ps.foo = field1;
29            ps.bar = field2;
30        }
31    
32        public void runFunction(){
33            doSomethingWith ps
34        }
35    }

有关上述结构的问题 -

  1. 乍一看,在这种外观中使用全局变量"不正确"?什么将被考虑"适当"使用全局变量?
  2. 第9行 - 如果我要更改表单以便field1&字段2是公开的,而是拨打Gloabls.ThisAddIn.setProperties()并在第28 + 29行说ps.foo = ui.field1.Value;& ps.bar = ui.field2.Value; - 是否会被视为"不良做法"?在什么情况下这种语法适用?
  3. 第10行&第27行和第27行的相应功能32 - 我正在考虑更改结构以使setProperties函数返回someProperties结构而不是将其作为全局变量,然后使用该返回值传递给runFunction()这样:
  4. Globals.ThisAddIn.runFunction(globals.ThisAddIn.setProperties(foo, bar));
    
    public someProperties setProperties(string field1, string field2) {
        someProperties ps = new someProperties();
        ps.foo = field1;
        ps.bar = field2;
        return ps;
    }
    
    public void runFunction(someProperties ps){
        doSomethingWith ps;
    }
    

    这种结构比我现有的更好吗?如果是这样的话,为什么会这么糟糕"在这个例子中使用全局变量?

1 个答案:

答案 0 :(得分:2)

  1. 正确使用全局变量的主要时间是它们是否为常数,因此消除了函数更改其值的危害,并且无法找到发生更改的位置。

  2. 如果你要将它们公之于众,视为不良做法,首先是因为它们应该是属性,而不是公共字段。我会直接避免使用这些字段,以进一步保留封装。

  3. 这似乎是一个更好的选择,虽然我仍然相信有更实用的方法可以在没有全局变量的情况下获得这种效果,这也会增加封装。

  4. 修改

    不了解您的计划,可能是这样的:

    public static class ThisAddInManager
    {
        struct someProperties
        {
            public string foo, bar;
        }
    
        public static var SomeProperties { private get; set; } = new someProperties();
        public static var UI { private get; set; } = new formClass();
    
        public static void OpenUI() => UI.showDialog();
        public static void RunFunction() => doSomethingWith(SomeProperties);   
    }
    

    您可以详细了解有关属性here

    的信息