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

Откуда: Зеленоград
Сообщений: 2076
iskatelsql
Да блин, задал я вопросик... Семь страниц. одного заблокировали... Я вас уже что-то боюсь.

Просто вопросики надо толком формулировать. Тогда будут обсуждать их, а не фигню всякую :)
12 май 19, 16:47    [21882804]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Дмитрий Мух
Неделю в бане с нетерпением ждал, чтобы как попугай продолжить: "Ты десктоп не писал, десктоп не писал..." :)

Ну, в десктопе, там особые подходы нужны. DI там запрещен, паттерны запрещены, м.б. в какой-нибудь будующей версии и ООП запретят, весь винформс на статических классах перепишут.
12 май 19, 17:16    [21882820]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20554
Дмитрий Мух
Неделю в бане с нетерпением ждал, чтобы как попугай продолжить
так WebPrj - это ж клон, не узнал по стилю? Картинка с другого сайта.
12 май 19, 19:03    [21882857]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Shocker.Pro
Дмитрий Мух
Неделю в бане с нетерпением ждал, чтобы как попугай продолжить
так WebPrj - это ж клон, не узнал по стилю? Картинка с другого сайта.

А "Web" к никнейму добавлен для пущей конспирации? :-)))
12 май 19, 20:18    [21882879]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro,
А ты узнал по стилю рассуждающих про десктоп, ни разу не писавших form.show();
))
12 май 19, 20:18    [21882880]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Siemargl
fkthat
WebPrj,

А насчет десктопа, вот, вполне себе жизненный пример:

+
public static class GlobalTimer {
    public static event EventHandler Tick;

    // .......
    // .......
}

public class MyForm: Form {
   public MyForm() {
        GlobalTimer.Tick += timer_Tick;
   }

   // ......
   // ......
}



Пользователь стопиццот раз откроет и закроет эту форму и все стопиццот экземпляров её объекта останутся висеть в памяти до конца работы приложения. Но это ведь тоже не утечка памяти, так ведь?

Именно так. Это не утечка, это архитектурный про*б.
У тебя проблема с терминологией. Есть еще <memory hog>

Читайте по чайной ложке на ночь этого мембера. Дети мои.
Его стиль - профессионализм.
12 май 19, 20:24    [21882882]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Я так понимаю, на вопрос, в чем разница между статиком без конструктора и статиком с конструктором (даже пустым), никто из поклонников статиков ответить так и не может? Как же вы так свой основной инструмент не знаете?

+ Спойлер

Статик без конструктора метится компилятором флагом "beforefieldinit". Поэтому его поля будут инициализированы только тогда, когда одно из них действительно понадобится. У статика с конструктором такого флага нет, поэтому поля проинитятся при любом первом вызове класса, даже если этому вызову ни одно поле не требуется.
12 май 19, 20:49    [21882887]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Petro123
Читайте по чайной ложке на ночь этого мембера. Дети мои.
Его стиль - профессионализм.

Тоже твой клоун, что ли?
12 май 19, 21:01    [21882892]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Petro123
Читайте по чайной ложке на ночь этого мембера. Дети мои.
Его стиль - профессионализм.

Тоже твой клоун, что ли? Картинка с другого сайта.
тебя тоже в игнор поставить?
12 май 19, 21:18    [21882897]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Petro123
тебя тоже в игнор поставить?

Да ты чо, я же этого не переживу
12 май 19, 21:56    [21882903]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
ОК. Будешь вторым балаболом на всем sql.ru.
12 май 19, 23:06    [21882919]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
fkthat
Я так понимаю, на вопрос, в чем разница между статиком без конструктора и статиком с конструктором (даже пустым), никто из поклонников статиков ответить так и не может? Как же вы так свой основной инструмент не знаете?

+ Спойлер

Статик без конструктора метится компилятором флагом "beforefieldinit". Поэтому его поля будут инициализированы только тогда, когда одно из них действительно понадобится. У статика с конструктором такого флага нет, поэтому поля проинитятся при любом первом вызове класса, даже если этому вызову ни одно поле не требуется.
Прикольно. Есть в оф.документации ?
Только я не понял практической разницы или объяснения:
- нет конструктора - объект инициализируется при обращении к любому полю (но не методу ???)
- есть конструктор - при обращении в т.ч к любому методу, даже если метод пустой

И ?

ЗЫ. Я не сторонник глобальных объектов и в т.ч стат.классов С№. Но каждый гвоздь бывает нужен
12 май 19, 23:48    [21882924]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Siemargl
Прикольно. Есть в оф.документации ?
Только я не понял практической разницы или объяснения:
- нет конструктора - объект инициализируется при обращении к любому полю (но не методу ???)
- есть конструктор - при обращении в т.ч к любому методу, даже если метод пустой


Да, есть где-то. Можно погуглить по "beforefieldinit flag".

Вот пример:

    public class Bar
    {
        public Bar()
        {
            Console.WriteLine("Hello from Bar");
        }
    }
    
    public static class FooWithoutCtor
    {
        private static Bar _bar = new Bar();

        public static void HelloFoo()
        {
            Console.WriteLine("Hello from Foo without ctor");
        }
    }

    public static class FooWithCtor
    {
        private static Bar _bar = new Bar();

        static FooWithCtor()
        {
        }

        public static void HelloFoo()
        {
            Console.WriteLine("Hello from Foo with ctor");
        }
    }

    public class Program
    {
        private static void Main()
        {
            FooWithoutCtor.HelloFoo();
            // "Hello from Foo without ctor"

            FooWithCtor.HelloFoo();
            // "Hello from Bar"
            // "Hello from Foo with ctor"
        }
    }


Т.е. в первом случае поле _bar так и не проинициализировалось, т.к. оно не требовалось, а во втором случае это все равно произошло.
13 май 19, 00:12    [21882929]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
fkthat,

два предмета (с) анекдот
- практическое значение
- описанность в документации

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

Откуда:
Сообщений: 1164
Siemargl
fkthat,

два предмета (с) анекдот
- практическое значение
- описанность в документации

а ты полотенце принес.....

Практическое значение - "lazy" инициализация. В документации описан этот флаг, который я упоминал. Про то, как компилятор его проставляет, я так сразу ссылку дать не могу, но на эту тему было много статей, потому что при переходе с .NET 2 на 4 это поведение поменялось и некоторых это немного удивило.
13 май 19, 06:06    [21882952]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2076
Shocker.Pro
Дмитрий Мух
Неделю в бане с нетерпением ждал, чтобы как попугай продолжить
так WebPrj - это ж клон, не узнал по стилю? Картинка с другого сайта.

Были подозрения, но ник вроде в 2010-м зареган, поэтому сомневаюсь :)
13 май 19, 08:42    [21882986]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

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


fkthat, тебе оказана большая честь, теперь ты второй после Пети Картинка с другого сайта.
13 май 19, 08:44    [21882989]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
fkthat,
 Console.WriteLine("Not static: {0}", Measure(() => Repeat(n, ()=> { var p = new Program(); p.NotStatic(); })));
13 май 19, 10:29    [21883082]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
Добавь еще
  private int[] iArr;
        public Program()
        {
            iArr = new int[10000];
        }
13 май 19, 10:33    [21883085]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

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


Сравнение будет некорректное потому что будет сравниваться не вызов с вызовом а создание объекта + вызов с просто вызовом.
13 май 19, 10:41    [21883093]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ
Добавь еще
  private int[] iArr;
        public Program()
        {
            iArr = new int[10000];
        }


Да чо уж там мелочиться - давай сразу туда добавим разложение стопитисотзначного числа на простые множители, типа, наша лошадь проигрывает - привяжем тогда сопернику гирю двухпудовую к хвосту
13 май 19, 10:47    [21883103]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
fkthat
Siemargl
fkthat,

два предмета (с) анекдот
- практическое значение
- описанность в документации

а ты полотенце принес.....

Практическое значение - "lazy" инициализация. В документации описан этот флаг, который я упоминал. Про то, как компилятор его проставляет, я так сразу ссылку дать не могу, но на эту тему было много статей, потому что при переходе с .NET 2 на 4 это поведение поменялось и некоторых это немного удивило.

А теперь правильный ответ.
https://docs.microsoft.com/ru-ru/visualstudio/code-quality/ca1810-initialize-reference-type-static-fields-inline?view=vs-2019
13 май 19, 10:58    [21883111]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
И https://docs.microsoft.com/ru-ru/visualstudio/code-quality/ca2207-initialize-value-type-static-fields-inline?view=vs-2019
13 май 19, 11:00    [21883113]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Siemargl,

Во, даже такое есть. Но для этого, чтобы увидеть, наверное FxCop надо прикручивать.
13 май 19, 11:24    [21883145]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 8 9 [10] 11 12   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить