Экземпляр класса C # со статическим методом против использования памяти статическим классом - PullRequest
21 голосов
/ 27 февраля 2010

Как C # или другие языки в этом отношении управляют распределением памяти (и выделением памяти) между этими двумя сценариями:

1.) Вызывается метод статического класса.

public Program {
    Foo foo = Loader.load();
}

public static Loader {
    public static Foo load() {
        return new Foo();
    }
}

2.) Метод вызывается для экземпляра, который затем выходит из области видимости.

public Program {
    Foo foo = new Loader().load();
}

public Loader {
    public Foo load() {
        return new Foo();
    }
}

Полагаю, статический класс загружен и остается в памяти; тогда как экземпляр класса уступает сборщику мусора на досуге C #. Есть ли плюсы или минусы в этих двух парадигмах? Есть ли когда-нибудь время, когда у вас есть класс, который никогда не требуется создавать (например, какой-то загрузчик ресурсов или фабрика), но вы все равно используете вторую методологию, чтобы воспользоваться преимуществами сборки мусора?

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

Ответы [ 4 ]

9 голосов
/ 27 февраля 2010

Ваш второй пример не работает, поэтому давайте рассмотрим реальные варианты:

1.) Вызывается метод статического класса.

public Program {
   Foo foo = Loader.Load();
}

public static Loader {
   public static Foo Load() {
      return new Foo();
   }
}

2.) Вызывается статический метод в нестатическом классе.

public Program {
   Foo foo = Loader.Load();
}

public Loader {
   public static Foo Load() {
      return new Foo();
   }
}

3.) Метод экземпляра вызывается для экземпляра

public Program {
   Foo foo = new Loader().Load();
}

public Loader {
   public Foo Load() {
      return new Foo();
   }
}

Два первых одинаковы. Вызов статического метода одинаков, независимо от того, является ли класс статическим или нет.

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

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

1 голос
/ 27 февраля 2010

Вторая форма создает временный объект Loader (который очень дешев). Вам всегда нужно будет загружать класс Loader, независимо от того, какой подход вы выберете.

Здесь очень мало производительности (экономия памяти). Обычно вы выбираете статический член в статическом классе, если нет необходимости в «состоянии» вне методов локальных переменных.

1 голос
/ 27 февраля 2010

Статический метод, поле, свойство или событие вызывается в классе, даже если экземпляр класса не создан.

http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

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

0 голосов
/ 27 февраля 2010

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

Создание экземпляра класса просто для вызова метода приведет к потере значительной вычислительной мощности (из-за создания экземпляра, назначения ему памяти и сбора мусора).

Вместо сохранения определения, а затем поверх него - экземпляра. Почему бы просто не оставить определение (статическое).

Пока вы не храните данные в статических переменных, ваш статический метод должен занимать столько же памяти, сколько и определение нестатического метода. Но используя статический метод, только метод будет храниться в памяти и быть готовым к вызову в любое время без создания экземпляров. Если метод не статичен, его нужно будет создать (используя память и вычислительные ресурсы) и собрать мусор (освободить память и использовать процессор), поэтому лучше использовать статический член. Вот для чего они там.

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