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

С# static vs instance methods

Я рискую, это может быть новым вопросом, но здесь. Я соблазн добавить метод в класс, который может иметь тысячи и тысячи экземпляров в памяти в данный момент времени. Теперь другой вариант создает статический класс со статическим методом и просто создает там [статический] метод вместо метода экземпляра в классе. Что-то вроде этого:

Это:

public static class PetOwner
{
    public static void RenamePet(Pet pet, string newName)
    {
        pet.Name = newName;
    }
}

Вместо этого:

public class Pet
{
    public string Name { get; set; }

    public void Rename(string newName)
    {
        this.Name = newName;
    }
}

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

Спасибо!

4b9b3361

Ответ 1

Только поля данных требуют хранения на один экземпляр при определенных условиях и оптимизации. Например, 10 000 экземпляров класса, которые определяют член Int32, будут потреблять ~ 40000 байт памяти.

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

object.ReferenceEquals("", string.Empty) // returns true!

Если те же 10000 экземпляров также определяют строку, и эта строка одинакова для каждого экземпляра, тогда у вас будет 10 000 ссылок, указывающих на одни и те же данные, что значительно уменьшит накладные расходы (но в 32-разрядной среде, там еще 40 000 байт заняты ссылками).

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

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

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

Ответ 2

Методы существуют только один раз в памяти, независимо от того, являются ли они статическими или нет, поэтому нет никакой разницы в использовании памяти.

Ответ 3

В дополнение к ответу Гуффа:

Методы существуют только один раз в памяти, независимо от того, являются ли они статическими или нет, поэтому нет никакой разницы в использования памяти.

Метод экземпляра имеет экземпляр класса, переданный ему как невидимый (который может быть явно доступен через параметр this), по существу делая newName из void Rename(string newName) вторым параметром, переданным вашему методу экземпляра; таким образом, получившиеся в результате инструкции для static void RenamePet(Pet pet, string newName) и void Rename(string newName) выглядят по существу одинаковыми, поэтому у них нет различий в производительности или вообще

Ответ 4

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

Ответ 5

Количество экземпляров класса не влияет на объем памяти, которую использует метод.

Ответ 6

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

Ответ 7

В случае памяти это не имеет никакого значения. Методы существуют только один раз в памяти, независимо от статичности или экземпляра, но статические методы являются более быстрыми для вызова, чем методы экземпляра, потому что методы Instance фактически используют "этот указатель экземпляра как первый параметр, поэтому метод экземпляра всегда будет иметь служебные данные

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

Ответ 8

Вам не нужен метод "Переименовать" вообще; у вас уже есть один, это сеттер свойства Name. Методы экземпляров не требуют больше и больше памяти для каждого экземпляра, это было бы глупо.

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