Новый объект, созданный в методе получения статических свойств, создается только один раз?

Я создаю статический вспомогательный класс для веб-сервисов, которые я пишу. Я использую API Telligent и, следовательно, создаю эти "сервисные" объекты Telligent, которые позволяют мне что-то делать с платформой. Например, я создаю объект MembershipSerice в своем вспомогательном классе, чтобы я мог выполнять членство с одним и тем же объектом. В моем вспомогательном классе у меня есть свойство с геттером, который создает новый из следующих объектов:

private static MembershipService _MembershipService {
  get {
    return new MembershipService(path, usr, pwd);
  }
}

И тогда у меня есть метод, который возвращает это свойство:

public MembershipService getMembershipService() {
  return _MembershipService;
}

Означает ли это, что поскольку свойство является статическим, новый объект, созданный в получателе, создается только один раз? Кроме того, с точки зрения стиля кодирования, было бы лучше сделать свойство общедоступным, и, следовательно, метод не был бы необходим.

Или... было бы лучше просто создать объект как частную переменную и вернуть его через открытый метод:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
public MembershipService getMembershipService() {
  return _mbrSvc;
}

// then called elsewhere by me via:
MembershipService svc = MyHelperClass.getMembershipService();

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

3 ответа

Решение

Означает ли это, что поскольку свойство является статическим, новый объект, созданный в получателе, создается только один раз?

Нет, потому что у вас есть

new MembershipService(path, usr, pwd);

внутри геттера, независимо от _MembershipService быть объявленным static новый экземпляр будет создаваться при каждом вызове. Все это static в этом контексте означает, что вы можете вызывать метод, не имея экземпляра определяющего класса.

Что касается комментирования стиля, ну, это действительно зависит от того, что вы хотите сделать. Вы хотите один экземпляр? Если это так, создайте статическую переменную-член _mbrSvc и вернуть это из получателя:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
private static MembershipService _MembershipService {
    get {
        return _mbrSvc;
    }
}

В противном случае, как это хорошо.

Джейсон, Марк. Для полноты картины все зависит от определения MembershipService. Если MembershipService является классом, то объект разделяется между вызывающими методами. Если MembershipService является структурой, копия всегда создается. Просто называя его объект MembershipService, не указывает на разницу, поскольку в DotNet все является объектом.

Если создание объекта дорого, подумайте об использовании одноэлементного шаблона в сочетании с отложенной загрузкой:

private static MembershipService _mbrSvc;
private static MembershipService _MembershipService { 
    get { 
        if(_mbrSvc == null)
        {
          _mbrSvc = new MembershipService(path, usr, pwd); 
        }
        return _mbrSvc; 
    } 
} 

Каждый раз, когда вы используете новый, создается новый объект.

Следовательно, первый подход создает новый объект при каждом обращении к свойству.

То, что вы ищете, называется Singleton - ваш второй подход - это одна из возможностей реализовать его в C#.

Другие вопросы по тегам