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

StackOverflow https://stackoverflow.com/questions/2042857

Вопрос

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

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

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

public MembershipService getMembershipService() {
  return _MembershipService;
}

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

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

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

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

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

Это было полезно?

Решение

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

Нет, потому что у тебя есть

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-object не указывает на разницу, поскольку в DotNet все является объектом.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top