c#中的静态应用程序变量是个坏主意吗?

本文关键字:静态 应用程序 变量 | 更新日期: 2023-09-27 17:51:02

我有两个class

   public class DemoProperty 
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string MenuCode { get; set; }
        public string OriginalURL { get; set; }
     }
public class MyCommonProperties
{
        private static List<DemoProperty> _DemoList;
        public static List<DemoProperty> DemoList
        {
            get { return _DemoList; }
            set { _DemoList = value; }
        }
}

我需要在整个项目中保留一些公共数据。为此,我使用了一个应用变量,它包含一个Dictionary<string,List<DemoProperty>>

Global.asx

void Application_Start(object sender, EventArgs e)
{
        Application["DemoProperty"] = new Dictionary<string,List<DemoProperty>>();
        MyCommonProperties.DemoList= (Dictionary<string,List<DemoProperty>>)Application["CommonProperties"];
}

实际上我对它的缺点了解不多。如果这个主意不好,你能给我提个好主意吗?

c#中的静态应用程序变量是个坏主意吗?

static关键字所确保的是,特定的属性/类在应用程序中只存在一次。

这是一个非常普遍的问题,不幸的是,答案似乎是"视情况而定"。最终这是一个你想如何设计你的程序的问题。

制作一些static会使自动测试变得更加困难,因为你不能轻易地将你的程序解耦成更小的可测试部分(因为所有部分都直接与你的静态数据交互)。这也使得阅读代码更加困难,因为很难理解何时以及什么修改了全局数据。

我将试着用一个例子来下划线:

class Data {
    public static string Entry;
}
class Operations {
    void SetOne() {
         Data.Entry = "one";
    }
}

在这个例子中,对于调用SetOne()的人来说,该方法实际上在Data中设置了一些东西,这可能并不明显。

另一种方法是:

class Data {
    public string Entry;
}
class Operations {
    void SetOne(Data data) {
         data.Entry = "one";
    }
}

现在对于调用者来说,更明显的是Data被方法以某种方式使用了,因为调用现在看起来像SetOne(data)

以我个人的经验来看,static几乎从来不是个好主意。虽然它可能使事情在短期内更快,但它的缺点是可读性&代码的可测试性通常是不容忽视的。