在构造函数中初始化静态字段。这是正常的?

时间:2011-02-22 13:28:26

标签: c# static constructor

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)?

4 个答案:

答案 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调用之前。

'静态构造函数'实际上并不构造实例。我更喜欢称它为静态初始化器。

静态初始化程序也不允许访问修饰符。