Я понял. Благодарю.

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

Этот:

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

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

Спасибо!

 adrianbanks22 янв. 2011 г., 01:38
Взгляните на некоторые ответы наэтот вопрос.

Ответы на вопрос(8)

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

Решение Вопроса

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

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

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

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

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

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

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

 Carlo22 янв. 2011 г., 01:51
Действительно хороший ответ. Спасибо.
 Guffa20 мар. 2012 г., 09:13
Обратите внимание, что только в последних версиях компилятора"" а такжеString.Empty это тот же экземпляр. В более ранних версиях они были отдельными.
 Quick Joe Smith22 янв. 2011 г., 04:11
Я не сказал, что все строки были интернированы, и я подумал, что это хороший пример того, что я пытался подчеркнуть.
 BrokenGlass22 янв. 2011 г., 02:16
Джо: не все строки интернированы, этот конкретный пример плох

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

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

 Ed S.30 дек. 2012 г., 18:40
@Shimmy: нет, этоявляется ответ, это просто не то, что ожидал ОП. То, что вы можете думать только об одном решении, не означает, что лучших вариантов не существует. Методы не требуют памяти для каждого экземпляра, поэтому вся основа вопроса неверна.
 Shimmy31 дек. 2012 г., 00:43
Я понял. Благодарю.
 Shimmy30 дек. 2012 г., 05:24
Это должен быть комментарий, а не ответ.

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

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

сколько памяти использует метод.

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

 AbstractDissonance22 янв. 2011 г., 01:39
На самом деле все вызовы методов ведут себя как статические вызовы. Детали просто спрятаны за кулисами.
 Carlo22 янв. 2011 г., 01:37
Спасибо, это именно то, что я хотел знать.
 Quick Joe Smith22 янв. 2011 г., 01:58
Методы расширения являются довольно хорошим примером этого. Разница лишь в том, что они определены для другого класса и не имеют доступа к защищенным / закрытым членам экземпляра.
 Roger Johansson19 мая 2013 г., 13:03
Универсальные методы объединяются один раз для общей сигнатуры, поэтому они будут существовать более одного раза ...
 Guffa19 мая 2013 г., 21:28
@RogerAlsing: Да, но нет никакой разницы между методами экземпляра и статическими методами.

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

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

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

Ваш ответ на вопрос