Инициализируйте статическое поле в конструкторе. Это нормально? - PullRequest
6 голосов
/ 22 февраля 2011
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 ]

11 голосов
/ 22 февраля 2011

Нет, это вообще плохая идея. Каждый раз, когда вы создаете новый экземпляр, он будет заменять статическую переменную. Это почти наверняка не то, что вы хотите сделать.

Интересно, действительно ли здесь должно быть два класса - один для обслуживания домашних животных и один для обслуживания сотрудников. Трудно сказать по представленному коду, но то, что у нас есть, на самом деле не выглядит хорошей идеей.

5 голосов
/ 22 февраля 2011

Инициализация его в статическом конструкторе будет иметь больше смысла:

http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx

class SimpleClass
{
    // Static constructor
    static SimpleClass()
    {
        //...
    }
}
2 голосов
/ 22 февраля 2011

Это не рекомендуется, и обычно это плохая практика: теперь вызов статического метода GetUserFullName() вызовет исключение, если ни один экземпляр SharedCacheData не был создан заранее.

1 голос
/ 22 февраля 2011

статические поля являются членами класса;Конструктор предназначен для создания элементов экземпляра.И инициализация статических полей в экземплярах ctors противоречит философии OOPS.Конечно, вы можете сделать это;но это изменит значение статического поля для каждого экземпляра, созданного для этого типа.

Для инициализации статических полей используйте статический инициализатор - который вызывается при загрузке класса, т. е. перед созданием каких-либо членов экземпляра - до вызова ant ctor.

«Статический конструктор» фактически не создает экземпляр.Я предпочитаю называть это статическим инициализатором.

Также статические инициализаторы не допускают модификатор доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...