public class SharedCacheData : ISharedCacheData
{
private readonly ISharedPetsService mPetsService;
private static ISharedEmployeeService mSharedEmployeeService;
public SharedCacheData(ISharedPetsService petsService, ISharedEmployeeService employeeService)
{
mPetsService = petsService;
mSharedEmployeeService = employeeService;
}
public static string GetUserFullName(string key)
{
Hashtable value = HttpContext.Current.Application[USERFULLNAME_KEY] as Hashtable;
if (value == null)
{
value = new Hashtable();
HttpContext.Current.Application[USERFULLNAME_KEY] = value;
}
if (value.ContainsKey(key))
return value[key] as string;
string name = mSharedEmployeeService.FindOneUser(key);
value[key] = name;
return name;
}
是否在构造函数中初始化静态字段mSharedEmployeeService(service)?
答案 0 :(得分:11)
不,这通常是一个坏主意。每次创建新实例时,它都将替换静态变量。这几乎肯定不是你想要做的。
我想知道实际是否应该有两个类 - 一个用于宠物服务,一个用于员工服务。从提供的代码中很难说出来,但我们在这里看到的并不是一个好主意。
答案 1 :(得分:5)
在静态构造函数中初始化它会更有意义:
http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx
class SimpleClass
{
// Static constructor
static SimpleClass()
{
//...
}
}
答案 2 :(得分:2)
这不推荐,通常是不好的做法:如果事先没有创建GetUserFullName()
的实例,现在调用静态方法SharedCacheData
会导致异常。
答案 3 :(得分:1)
静态字段是类成员;构造函数用于创建实例成员。 并且在实例ctors中初始化静态字段与OOPS philosphy相反。你当然可以这样做;但是这将为为该类型创建的每个实例更改静态字段的值。
要初始化静态字段,请使用静态初始化程序 - 在类加载时调用,即在创建任何实例成员之前 - 在ant ctor调用之前。
'静态构造函数'实际上并不构造实例。我更喜欢称它为静态初始化器。
静态初始化程序也不允许访问修饰符。