Вызывает ли утечка памяти использование члена stati c внутри нестатического c метода? - PullRequest
3 голосов
/ 14 июля 2020

Вызывает ли метод DoSomething() утечку памяти?

public static class AppContext
{
   public static int ApplicationStateId {get; set} 
   ...
} 
public class MyService
{
     public void DoSomething()
     {
        ....
        if(AppContext.ApplicationStateId == 1) 
        {
             //do something
        } 
     }
}
var service = new MyService();
service.DoSomething();

Это означает, что переменные stati c и все, на что они ссылаются, никогда не будут собираться мусором.

Майкл сказал в 8 способов вызвать утечку памяти в . NET.

1 Ответ

4 голосов
/ 14 июля 2020

Здесь нет "утечки"; это просто ожидаемое поведение. Да, все, что доступно через поле stati c, не будет собираться G C, но обычно это правильно с точки зрения какого-то глобального состояния. Под «утечкой» мы обычно подразумеваем неожиданное или необъяснимое удержание памяти. Наиболее распространенный сценарий - это stati c events , которые звучат как отличная идея, но позволяют очень легко поддерживать в рабочем состоянии целые сегменты давно избыточных объектов. Например:

SomeType.SomeStaticEvent += obj.HandleTheThing;

, что теперь означает, что объект из obj теперь сохраняется навсегда (или, по крайней мере, до тех пор, пока делегат не будет явно удален из события), и все, что может видеть obj: теперь сохраняется навсегда, et c.

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

Меня больше беспокоят такие вещи, как параллелизм - означает ли это «несколько текущих пользовательских станций» или детали низкого уровня, такие как изменчивость и использование регистров полей.

...