全局变量有哪些可能的替代方案,哪一个最好? 正如我所听说的那样,使用全局变量并不好。 我正在研究WCF应用程序,并且可能存在多个WCF实例,并且很少有机会使用并发。
此WCF服务将部署到服务器,然后客户端将发送一系列请求,但请求具有一些唯一请求,应在剩余请求中维护。
答案 0 :(得分:1)
正如评论中所提到的,没有全局变量,但类的静态属性/字段是接近意味着什么。
在WCF代码中使用任何静态属性/字段(保持状态的静态成员)非常小心。每个WCF调用都是同一进程中的一个单独的线程,因此它们将共享静态属性/字段的值。这可能会导致不可预测的结果并且难以调试问题。
......我将使用并发的可能性很小
如果代码在WCF中运行,那么它几乎总是并发的。要非常小心。
您可以使用在这种情况下可以帮助您的线程模式(单一并发模式),但您仍需要仔细设计系统。
答案 1 :(得分:1)
变量越“全局”,访问它就越容易。但是,只要应用程序中的每个组件都访问它,您的应用程序就越来越依赖于该变量。您无法更改变量,因为它随处可见。
自动化测试变得丑陋,需要对应用程序的每次修改进行修改,并且不能重用使用全局变量的任何组件。
如果你想使用“全局变量”(公共静态成员)尝试尽可能地限制它的使用,例如当你创建一个类的实例时,将变量的值提供给它的构造函数,以便该课程不依赖于“全球”参考。
更详细地说,你有这个课程:
public class MyUsefulClass
{
public void DoSomethingUseful()
{
Console.WriteLine("The value is: " + MyGlobalVariables.Variable1);
}
}
new MyUsefulClass().DoSomethingUseful();
然后,如果您可以引用MyUsefulclass
,则只能使用MyGlobalVariables.Variable1
。您不能在不具有这些全局变量的其他项目中重用MyUsefulclass
。
将其重写为:
public class MyUsefulClass
{
public MyUsefulClass(string valueToWrite)
{
ValueToWrite = valueToWrite;
}
public string ValueToWrite { get; private set; }
public void DoSomethingUseful()
{
Console.WriteLine("The value is: " + ValueToWrite);
}
}
new MyUsefulClass(MyGlobalVariables.Variable1).DoSomethingUseful();
new MyUsefulClass("I don't need globals!").DoSomethingUseful();
在这种情况下,您可以重用MyUsefulClass
,而无需在新项目中出现全局变量。你仍然有一个“全局”-ish变量,但是通过这种修改,更少的代码依赖于“它是全局的”。