Подтвердить что ты не робот

Экземпляр класса С# с использованием статического метода и использования памяти статического класса

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

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

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

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

4b9b3361

Ответ 1

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

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. В этом случае мало что имеет значения, так как нет реальных данных в объекте для доступа.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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