Могут ли статические свойства возвращать новые экземпляры объектов / классов в c #

1

Я создаю приложение в ASP.NET MVC 4. Я создаю класс (похожий на тип Factory), который вернет мне экземпляр моих классов обслуживания, которые я сделал в BAL Layer. Я хочу объявить статические свойства в этом классе, и они должны вернуть экземпляр запрошенного класса обслуживания.

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

Код, сделанный до сих пор

public class Factory
{
    public static CountryService CountryServiceInstance
    {
        get
        {
            return new CountryService(new CountryRepository());
        }
    }
}
  • 0
    Э-э ... хотя вы можете заставить получателей возвращать новые экземпляры каждый раз и вести себя так, это будет очень запутанным. Использование геттеров для всего, что не имеет доступа к логическому (иногда вычисляемому) свойству объекта, к которому они принадлежат, что приводит к путанице.
  • 0
    тогда как это должно быть сделано?
Показать ещё 5 комментариев
Теги:
oop
design-patterns

3 ответа

3

То, что вы должны сделать, это написать функцию, которая создаст новые экземпляры, а не свойство get

public class Factory
{
    public static CountryService CreateNewService()
    {
        return new CountryService(new CountryRepository());
    }
}

О вашей памяти относятся к чтению Шрирама Сактивеля
Подробнее о шаблоне Factory здесь: http://msdn.microsoft.com/en-us/library/ee817667.aspx

2

Свойство в С# - это просто метод, который возвращает то, что он должен возвращать в своем теле. В вашем случае каждый раз, когда вы обращаетесь к этому свойству, будет создан новый экземпляр службы.

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

private static readonly Lazy<CountryRepository> _fact 
    = new Lazy<CountryRepository>(() => new CountryRepository());

Кроме того, статическое свойство никогда не хранит что-либо "в памяти во всем приложении", но программист может это сделать.

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

static ключевое слово само указывает только, что к текущему члену класса не нужно обращаться, хотя this ключевое слово, и его значение будет передаваться по всему домену appdomain (или вашему приложению).

  • 0
    Могу ли я иметь общедоступные статические переменные только для чтения, вместо того, чтобы их частные. Во-вторых, если у меня много классов обслуживания, то такие переменные будут снижать производительность моего приложения?
  • 0
    @AnkushJain Вряд ли. Если вы оставите только static public readonly переменные, доступные только для чтения, видимые отовсюду, то простое чтение переменной по ссылке не будет проблемой производительности для вашего случая.
1

ваш метод CountryServiceInstance для каждого вызова всегда даст вам новый экземпляр CountryRepository.

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

вы, несомненно, можете продолжить свой грех.

если вы хотите быстро проверить, вы можете проверить созданные объекты hashcode object.GetHashCode(), они будут уникальными, поскольку они являются отдельными объектами

Ещё вопросы

Сообщество Overcoder
Наверх
Меню