А будет ли сборка мусора? - C#
Формулировка задачи:
Всем привет!
Посмотрите внимательно на следующий код:И ответьте на три вопроса:
namespace Temp { public class Program { public static void Main(string[] args) { SomeEnum a = SomeEnum.a; SomeEnum b = SomeEnum.b; while(true) { bool res = a.Equals(b); } } public enum SomeEnum { a, b, } } }
- Будет ли этот код инициализировать сборку мусора поколения 0? Если будет, то почему? Если не будет, то почему?
- А будет ли сборка мусора поколения 1? Тоже обосновать.
- А как насчёт сборки поколения 2? Обосновать.
Не по теме:
Для честности код не тестить. only for fans.
Решение задачи: «А будет ли сборка мусора?»
textual
Листинг программы
using System; using System.Runtime.CompilerServices; namespace Temp { public class Program { public static void Main(string[] args) { long count = 0; int n1 = 10; while(true) { int n2 = Boxing(n1); ++count; if(GC.CollectionCount(1) > 0) { //Падаем тут throw new Exception($"Gen0 = {GC.CollectionCount(0)}, count = {count}"); } } } [MethodImpl(MethodImplOptions.NoInlining)] public static int Boxing(int n) { object obj = n; if(GC.GetGeneration(obj) != 0) { //Это исключение не бросается throw new Exception(); } //без этого костыля компилятор вырезает боксинг и возвращает напрямую параметр n return (int)Transited(obj); } [MethodImpl(MethodImplOptions.NoInlining)] public static object Transited(object obj) { return obj; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д