Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 8 9 10 [11] 12   вперед  Ctrl      все
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
fkthat
ЕвгенийВ
fkthat,
 Console.WriteLine("Not static: {0}", Measure(() => Repeat(n, ()=> { var p = new Program(); p.NotStatic(); })));


Сравнение будет некорректное потому что будет сравниваться не вызов с вызовом а создание объекта + вызов с просто вызовом.

Еще будет напрягаться GC.
13 май 19, 11:40    [21883169]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ
Еще будет напрягаться GC.

Ну, GC работает с очень низким приоритетом, т.ч. даже когда он напрягается, то старается не сильно напрягать само приложение.
13 май 19, 11:54    [21883188]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Petro123
fkthat,
ОК. Будешь вторым балаболом на всем sql.ru.


Петро, ты расскажи лучше почтенной публике, за что тебя из Жавы выгнали - ты там тоже везде статические баттон-клики внедрить пытался?
13 май 19, 12:05    [21883200]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
fkthat
ЕвгенийВ
Еще будет напрягаться GC.

Ну, GC работает с очень низким приоритетом, т.ч. даже когда он напрягается, то старается не сильно напрягать само приложение.

тебе самое время почитать про сборку мусора :)
13 май 19, 12:06    [21883203]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ
тебе самое время почитать про сборку мусора :)

Что не так? Сборщик мусора просыпается, когда приложение простаивает. Для тебя это секрет?
13 май 19, 12:14    [21883212]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3445
мирные жители ложатся спать, мафия просыпается
13 май 19, 12:18    [21883218]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Roman Mejtes
мирные жители ложатся спать, мафия просыпается
))) +1
13 май 19, 12:26    [21883233]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Petro123
fkthat,
ОК. Будешь вторым балаболом на всем sql.ru.


Петро, ты расскажи лучше почтенной публике, за что тебя из Жавы выгнали - ты там тоже везде статические баттон-клики внедрить пытался? Картинка с другого сайта.
я тебя после фильтра вижу только квадратиком. Без текста)).
13 май 19, 12:28    [21883235]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
fkthat
ЕвгенийВ
тебе самое время почитать про сборку мусора :)

Что не так? Сборщик мусора просыпается, когда приложение простаивает. Для тебя это секрет?

Сборщик мусора запускается только когда система не может выделить память, если все сделать на статиках, он не запустится ни разу.
13 май 19, 13:20    [21883301]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3445
зачем вообще думать о том, когда запускается GC? это не ваша проблема, думать об этом не нужно, думать нужно о другом, о высоком
13 май 19, 13:31    [21883314]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
Roman Mejtes
зачем вообще думать о том, когда запускается GC? это не ваша проблема, думать об этом не нужно, думать нужно о другом, о высоком

Например пишешь экранное видео с 60 FPS, 1920 * 1080 * 4 * 60 = 497664000 байт/сек нужно переработать. При чем на каком нибудь целероне с 2 гигами оперативки.
13 май 19, 13:45    [21883326]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
5 страниц о милисекундах. Теперь о сборщике.
Продолжайте.
13 май 19, 13:45    [21883328]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ЕвгенийВ
пишешь экранное видео
всегда можно найти задачу где потребуется затачивать свой код под ограниченные ресурсы. Тема разве про это?
13 май 19, 13:48    [21883332]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9568
ЕвгенийВ
если все сделать на статиках

что это означает?
13 май 19, 13:54    [21883341]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ
Сборщик мусора запускается только когда система не может выделить память, если все сделать на статиках, он не запустится ни разу.

Это не сборщик мусора запускается, это у тебя в голове все очень запущено. Почитать про GC следует как раз тебе. Как я уже писал - попробуй с Рихтера начать "CLR via C#" или "Applied Microsoft .NET Framework".
13 май 19, 14:13    [21883373]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
ViPRos
ЕвгенийВ
если все сделать на статиках

что это означает?

Примерно это.

        class MyMath
        {
            private double _val;
            public MyMath(double val)
            {
                _val = val;
            }
            public double Sin()
            {
                return Math.Sin(_val);
            }
        }
        const int C1 = 100000000;
        static void Main(string[] args)
        {
           
          for(int i=0;i<C1;i++)
            {
                var x = Math.Sin(i);
            }
            Console.WriteLine(GC.CollectionCount(0));
            Console.WriteLine(GC.GetTotalMemory(false));

            for(int i=0;i<C1;i++)
            {
                var y = new MyMath(i);
                var x = y.Sin();
            }
            Console.WriteLine(GC.CollectionCount(0));
            Console.WriteLine(GC.GetTotalMemory(false));

            Console.ReadLine();

        }
13 май 19, 14:49    [21883442]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ
Примерно это.

Тебе, по-моему, бесполезно объяснять, что объекты подобных классов никто не станет создавать каждый раз, а сделают синглтоном.
13 май 19, 14:55    [21883450]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
С инициализацией статиков есть еще одна интересная засада, я как-то сейчас даже забыл про неё упомянуть. Что будет, если инициализация кинет ексепшен?

+ А будет вот что

CLR больше не будет предпринимать попытки снова инициализировать этот статический класс, заставить его это сделать тоже никак нельзя, т.ч. класс так и будет висеть неинициализированным до завершения приложения.
14 май 19, 07:11    [21883952]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
fkthat,
А ты попробуй.
    class C
        {
            static C()
            {
                var x = 0;
                var d = 7 / x;
            }
        }
      
        static void Main(string[] args)
        {

            C c = new C();
            Console.ReadLine();

        }
14 май 19, 09:21    [21884050]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ,

Я сейчас вместо этого попробовал вот так:

    public static class Foo
    {
        static Foo()
        {
            Console.WriteLine("Entering constructor.");
            var x = 0;
            var y = 42 / x;
            Z = 69;
        }

        public static int Z { get; }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            for (var i = 0; i < 6; i++)
            {
                try
                {
                    Console.WriteLine(Foo.Z);
                }
                catch
                {
                    Console.WriteLine("Exception thrown.");
                }
            }
        }
    }



Entering constructor.
Exception thrown: System.TypeInitializationException
Exception thrown: System.TypeInitializationException
Exception thrown: System.TypeInitializationException
Exception thrown: System.TypeInitializationException
Exception thrown: System.TypeInitializationException
Exception thrown: System.TypeInitializationException

Поведение оказалось даже более забавное, чем я ожидал. Похоже, что после того как один ексепшен выкидывается из конструктора, обращение к какому-то статическому методу или свойству автоматом кидает TypeInitializationException, даже не пытаясь снова этот конструктор выполнить.
14 май 19, 09:44    [21884068]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
fkthat

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

Нормальное поведение. Если тип не инициализован, использовать его нельзя.
14 май 19, 13:48    [21884385]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3445
Console.WriteLine("Exception thrown.");

Exception thrown: System.TypeInitializationException


Код и результаты выполнения не совпадают :D

кстати, если в блоке catch {} (без указания типа исключения) остановить отладчик, то можно посмотреть значение исключения через "переменную" $exception в QuickWatch (Shift+F9), но только в режиме отладки
14 май 19, 13:58    [21884407]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ЕвгенийВ
fkthat
Поведение оказалось даже более забавное, чем я ожидал. Похоже, что после того как один ексепшен выкидывается из конструктора, обращение к какому-то статическому методу или свойству автоматом кидает TypeInitializationException, даже не пытаясь снова этот конструктор выполнить.

Нормальное поведение. Если тип не инициализован, использовать его нельзя.
скажу больше. Не рекомендуют райзе в конструкторе во многих ЯП, а не только в шарпе).
14 май 19, 14:04    [21884415]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ
Нормальное поведение. Если тип не инициализован, использовать его нельзя.


Это естественно, засада в том, что его после первой неудачи никак уже нельзя попытаться инициализировать повторно. Например, Lazy<T> имеет специальный параметр в конструкторе, который как раз позволяет то или иное поведение при неуспешной инициализации выбрать.
14 май 19, 14:05    [21884418]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
fkthat
Например, Lazy<T> имеет специальный параметр в конструкторе, который как раз позволяет то или иное поведение при неуспешной инициализации выбрать.

Удивительное рядом. Это какой такой параметр?
14 май 19, 14:34    [21884466]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 8 9 10 [11] 12   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить