为什么要使用GlobalClass?它们适用于什么?我继承了一些代码(如下所示),据我所知,strUserName没有理由需要这个。这是为了什么?
public static string strUserName
{
get { return m_globalVar; }
set { m_globalVar = value; }
}
稍后用作:
GlobalClass.strUserName
由于
答案 0 :(得分:1)
你得到了全局状态的所有错误,没有令人讨厌的直接变量访问。
如果您要这样做,那么您的编码器就可以很好地实现它。他/她可能(正确地)认为他们可以在以后更换实施。
一般来说,这被认为是一个坏主意,因为它使得整个系统很难测试你的全局变量。
我的2美分。
答案 1 :(得分:0)
如果您想使用某种类型的静态成员,请将其用作ClassName.MemberName
。如果您的代码片段与您引用的成员属于同一个类(在此示例中,您在GlobalClass成员中编码,并使用strUserName),则可以省略类名。否则,它是必需的,因为编译器不会知道你所指的是什么类。
答案 2 :(得分:0)
这是在ASP.Net中处理Context时的常用方法;但是,实现永远不会使用单个变量。因此,如果这是一个Web应用程序,我可以看到这种方法用于指示当前用户是谁(尽管有更好的方法可以做到这一点)。
我使用simillar方法,我有一个MembershipService.CurrentUser属性,然后从SessionState或LogicalCallContext(如果它是一个Web或客户端应用程序)拉出用户。
但在这些情况下,这些都不是全局的,因为它们的范围很窄(如http会话状态)。
我使用过这样的全局的一种情况是,如果我有一些静态的数据并且永远不会更改,并且从DB加载(并且没有足够的数据来证明将其存储在缓存中)。你可以将它存储在一个静态变量中,这样你就不必回到数据库了。
一方面注意为什么开发人员使用匈牙利表示法来命名属性?即使没有智能感知和我们的IDE所提供的所有优点,我们也从未在属性上使用过匈牙利符号。
答案 3 :(得分:0)
静态助手方法是方便地抽象无状态功能块的好方法。然而在这个例子中,全局变量有可能是有状态的 - 得墨忒耳定律指导我们你应该只玩你拥有或被给予的国家,例如按参数。
根据规则,有时需要打破它们。您应该交换使用全局状态的风险(主要是创建状态/并发错误的风险)与使用全局变量的必要性。
答案 4 :(得分:0)
如果你想让一个数据可用于在jvm中运行的任何其他类,那么Global Class就是你的选择。
只有两个小问题;
一。显示的implmentation不是线程安全的。任何全局类的set ...方法都应标记为关键或包含在互斥锁中。 即使在上面的niave示例中,考虑如果两个线程同时运行会发生什么: set(“Joe”)和set(“Frederick”)可能导致“Joederick”或“Fre”或其他一些排列。
两个。它不能很好地扩展。 “全球”是指单个jvm。像Jboss这样更复杂的运行时环境可以运行几个相互通信的jvms。因此,全局用户标识可以是“Joe”或“Frederick”,具体取决于您的EJB安排的jvm。