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"];
}
实际上我对它的缺点了解不多。如果这个主意不好,你能给我提个好主意吗?
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
几乎从来不是个好主意。虽然它可能使事情在短期内更快,但它的缺点是可读性&代码的可测试性通常是不容忽视的。