Новый объект, созданный в получателе статических свойств, создается только один раз? - PullRequest
6 голосов
/ 11 января 2010

Я создаю статический вспомогательный класс для веб-сервисов, которые я пишу. Я использую 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 ]

14 голосов
/ 11 января 2010

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

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

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;
    }
}

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

4 голосов
/ 11 января 2010

Джейсон, Марк Для полноты картины это также зависит от определения 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; 
    } 
} 
1 голос
/ 11 января 2010

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

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

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

...