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

Откуда:
Сообщений: 783
Есть статический класс, к примеру

    static class asd
    {
        public static int m;

        public static int sum_m(int a)
        {
            return a + m;
        }
    }

где m - некоторая глобальная переменная для всех ф-ций класса, требующая присвоения значения.

В случае с обычным классом я бы создал конструктор с этой переменной, и компилятор просто не дал бы создать объект без ее инициализации.

А в статическом классе можно сделать как-то так, чтоб компилятор ругался "нефиг вызывать методы этого класса, не проинициализировав переменную", если перед вызовом любого метода не присвоить ей значение?
1 май 19, 05:32    [21876116]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
1) Статики - зло;
2) Мембер класса всегда инициализируется автоматически значением по умолчанию.
3) Public fields - зло. Замени на свойство и поставь проверку что было присвоение.
4) Освой общепринятый стиль именования для C#

static class asd {
    private static bool _mInitialized;
    private static int _m;

    public static int M {
         get { return _m; }
         set {
            _mInitialized = true;
            _m = value;
         }
    }

    public static int sum_m(int a) {
        if(!_mInitalized) throw new InvalidOperationException("Инициализируй M, блеат!");
        return _m + a;
    }
}
1 май 19, 07:59    [21876127]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
iskatelsql
public static int m = 3.14;

?
1 май 19, 08:37    [21876132]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Public fields - зло
глобальные константы же.
1 май 19, 08:39    [21876135]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
iskatelsql
если перед вызовом любого метода не присвоить ей значение?
если инициализация перед вызовом метода, то помести ее параметром в метод. И все тебя поймут сразу.
1 май 19, 08:41    [21876137]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
iskatelsql,
Либо откажись от статического. Г.. код будет.
1 май 19, 08:44    [21876138]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
iskatelsql
public static int m = 3.14;

?

Не. Как я понял, он хочет проверять, чтобы статик был явно инициализирован из внешнего кода перед тем как его вызывают.
1 май 19, 09:03    [21876148]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26479
iskatelsql
А в статическом классе можно сделать как-то так, чтоб компилятор ругался "нефиг вызывать методы этого класса, не проинициализировав переменную", если перед вызовом любого метода не присвоить ей значение?

Любопытно узнать реальную задачу, а не вот это :)
1 май 19, 09:13    [21876153]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
"Перед вызовом" это уход от статического в обычный класс. Об этом я и написал.
У него нет логики в постановке.
1 май 19, 09:17    [21876156]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
В с++ нет статических классов, но есть макросы.
В шарпе нет макросов, но есть статические классы.
И оба мучаются))))
1 май 19, 09:44    [21876169]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Dima T
Member

Откуда:
Сообщений: 13673
Petro123
В с++ нет статических классов, но есть макросы.

В обычных классах есть static методы и static переменные.
1 май 19, 09:51    [21876173]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Dima T,
Есть обходные пути) . Но я про классы.
1 май 19, 10:16    [21876183]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
В с++ нет статических классов, но есть макросы.
В шарпе нет макросов, но есть статические классы.
И оба мучаются))))

Вот и я ж говорю - хочется что-то расшарить между кодом - делайте просто синглетон, тем более, если есть DI контейнер, то он вам сам его сделает, и делать ничего не надо
сontainerBuilder.RegisterType<MySingleton>().As<IMySingleton>().SingleInstance();
1 май 19, 12:04    [21876223]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
делайте просто синглетон
много букв которые не написать по памяти.
Global.param = "глобальная константа";
Короче и запоминать не надо.
1 май 19, 12:07    [21876225]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
Какой DI в десктопе.
1 май 19, 12:08    [21876228]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20323
Petro123
Какой DI в десктопе.
а что мешает?
1 май 19, 12:09    [21876230]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro
Petro123
Какой DI в десктопе.
а что мешает?
израт делать?
Хороший вкус мешает.
1 май 19, 12:10    [21876232]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Кто тут еще не юзал static class)))
1 май 19, 12:12    [21876234]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Shocker.Pro
Petro123
Какой DI в десктопе.
а что мешает?

Лень ему мешает разобраться в том, что такое dependency injection.
1 май 19, 12:16    [21876236]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20323
Дмитрий Мух
Лень ему мешает разобраться в том, что такое dependency injection.
не, он вроде знает, только не понимает, что контейнер необязательно может быть из коробки ))
1 май 19, 12:19    [21876237]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Shocker.Pro
Дмитрий Мух
Лень ему мешает разобраться в том, что такое dependency injection.
не, он вроде знает, только не понимает, что контейнер необязательно может быть из коробки ))

для этого даже не надо книжку покупать, или скачивать

Картинка с другого сайта.

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

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro,
вам все потрындеть вместо ответа на простой вопрос.
Если программист, то приходилось ли вам использовать глобальные переменные или статик классы?
1 май 19, 12:26    [21876243]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
А писатели про DI вместо темы про static class идите лесом в другую тему.
1 май 19, 12:27    [21876245]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
fkthat,
Какой DI в десктопе.

Чо? У меня все консольные утилиты и те с DI пишутся.
1 май 19, 12:27    [21876247]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

Чо? У меня все консольные утилиты и те с DI пишутся.

А у меня в квартире Газ!
1 май 19, 12:28    [21876248]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Petro123
Shocker.Pro,
вам все потрындеть вместо ответа на простой вопрос.
Если программист, то приходилось ли вам использовать глобальные переменные или статик классы?

Парни, я может слепой, но где он выше этот вопрос задавал и мы уходили от ответа на него?
1 май 19, 12:30    [21876251]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
А писатели про DI вместо темы про static class идите лесом в другую тему.

Да тема так-то не твоя. Заведи свою, и устанавливай там свои правила
1 май 19, 12:30    [21876252]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Petro123
А писатели про DI вместо темы про static class идите лесом в другую тему.

Да тема так-то не твоя. Заведи свою, и устанавливай там свои правила Картинка с другого сайта.

это совет был, а не приказ).
У тебя и репозиторий свой написан. Теперь что? Статический класс не использовать?
1 май 19, 12:31    [21876254]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Shocker.Pro
Дмитрий Мух
Лень ему мешает разобраться в том, что такое dependency injection.
не, он вроде знает, только не понимает, что контейнер необязательно может быть из коробки ))

Хм.. А что, все контейнеры "из коробки" работают только для серверов? Я ни одного такого контейнера еще не видел.
1 май 19, 12:33    [21876255]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Petro123
А писатели про DI вместо темы про static class идите лесом в другую тему.

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

Откуда:
Сообщений: 1143
Shocker.Pro
Дмитрий Мух
Лень ему мешает разобраться в том, что такое dependency injection.
не, он вроде знает, только не понимает, что контейнер необязательно может быть из коробки ))

Он как тот, что "угадал все буквы, но не смог прочитать слово". В каждой теме "слышал звон, да не знаю где он"
1 май 19, 12:35    [21876257]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
да, да, пообсуждайте что я ем и завтракаю на завтрак.
Продолжайте!
1 май 19, 12:37    [21876258]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
fkthat
Shocker.Pro
пропущено...
не, он вроде знает, только не понимает, что контейнер необязательно может быть из коробки ))

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

И до сих пор сидит на Java 1.3, судя по тому, что про non-blocking I/O не слышал Картинка с другого сайта.
Или его вообще с Java выгнали давно.
1 май 19, 12:43    [21876260]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Пришёл к нам :)
1 май 19, 12:43    [21876261]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20323
fkthat
Хм.. А что, все контейнеры "из коробки" работают только для серверов? Я ни одного такого контейнера еще не видел.
А ты сможешь выковырять контейнер из ASP.NET Core и использовать в декстопе? Картинка с другого сайта.
1 май 19, 12:47    [21876263]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Shocker.Pro
fkthat
Хм.. А что, все контейнеры "из коробки" работают только для серверов? Я ни одного такого контейнера еще не видел.
А ты сможешь выковырять контейнер из ASP.NET Core и использовать в декстопе? Картинка с другого сайта.

Зачем выковыривать? Просто добавить ссылку на NuGet-пакет. Сказать какой? Картинка с другого сайта.
1 май 19, 12:56    [21876266]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
fkthat,
да, да, пообсуждайте что я ем и завтракаю на завтрак.
Продолжайте!

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

Откуда:
Сообщений: 1143
Shocker.Pro
fkthat
Хм.. А что, все контейнеры "из коробки" работают только для серверов? Я ни одного такого контейнера еще не видел.
А ты сможешь выковырять контейнер из ASP.NET Core и использовать в декстопе? Картинка с другого сайта.

А в чем проблема? Microsoft.Extensions.DependencyInjection - это отдельный пакет, который от ASP.NET вообще никак не зависит.
1 май 19, 13:05    [21876270]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
fkthat
Shocker.Pro
пропущено...
А ты сможешь выковырять контейнер из ASP.NET Core и использовать в декстопе? Картинка с другого сайта.

А в чем проблема? Microsoft.Extensions.DependencyInjection - это отдельный пакет, который от ASP.NET вообще никак не зависит.

Всю интригу испортил :)
1 май 19, 13:07    [21876273]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20323
Ну я на форуме для того и сижу, чтобы новые знания получать )
Иногда для этого достаточно задать глупый вопрос )
1 май 19, 13:09    [21876276]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Petro123
fkthat,
да, да, пообсуждайте что я ем и завтракаю на завтрак.
Продолжайте!

Я на завтрак завтракаю завтрак Картинка с другого сайта.
уже лучше.)
А то я обобщу про тебя что ты только консоль пишешь)).
На вопрос про классы ведь не ответил.
Крутые профи собрались. Детский сад превалирует.
1 май 19, 13:14    [21876281]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Shocker.Pro,

using Microsoft.Extensions.DependencyInjection;

namespace ConsoleApp5
{
    internal class Program
    {
        private static void Main()
        {
            var services = new ServiceCollection();
            services.AddSingleton<Foo>();
            using var provider = services.BuildServiceProvider();
            var foo = provider.GetRequiredService<Foo>();
        }
    }

    internal class Foo
    {
    }
}
1 май 19, 13:15    [21876284]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Shocker.Pro
Ну я на форуме для того и сижу, чтобы новые знания получать )
Иногда для этого достаточно задать глупый вопрос )

А, ну тогда знай, что .NET Core можно использовать ещё и для создания приложений для различных устройств и интернета вещей :)
1 май 19, 13:15    [21876285]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Дмитрий Мух
Или его вообще с Java выгнали давно.

Он, наверное, в Java разбирался так же, как сейчас в .Net ))
1 май 19, 13:24    [21876292]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
С тобой хорошо деньги пилить.
Там где надо несколько простых проектов, ты предлагаешь замутить общий мега интерфейс одинаковый на всю больницу.
Его пилили долго, но зато одинаковый. Ни у кого такого репозитория нет така как не нужен. Но у тебя есть. И ты страшно обиделся что тебя не поняли.
У тебя проблема в простых решениях. Они у тебя сдожные.
Сейчас вот тебя с DI на личности понесло.
Автору скажи - выкинь класс и возьми DI!!!
1 май 19, 13:30    [21876296]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Дмитрий Мух
Или его вообще с Java выгнали давно.

Он, наверное, в Java разбирался так же, как сейчас в .Net ))
я поржал выше над твоим конструктором в статик классе.
1 май 19, 13:32    [21876299]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
fkthat
Дмитрий Мух
Или его вообще с Java выгнали давно.

Он, наверное, в Java разбирался так же, как сейчас в .Net ))

Вполне вероятно.

Предлагаю ещё модульные (unit) тесты обсудить.
Спорим, пациент зачвит, что хороший вкус мешает ему их писать :)
1 май 19, 13:32    [21876300]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Petro123
fkthat
пропущено...

Он, наверное, в Java разбирался так же, как сейчас в .Net ))
я поржал выше над твоим конструктором в статик классе.

Над чем он поржал?
1 май 19, 13:35    [21876303]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Он, наверное, в Java разбирался так же, как сейчас в .Net ))
три чела отсюда приходят в java периодически. Но ведут себя очень скромно. Там флуд не по теме не то что невозможен. Он неинтересен никому там.
1 май 19, 13:46    [21876313]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
А то я обобщу про тебя что ты только консоль пишешь)).

ASP.NET Core так-то это и есть консольное приложение. Сюрприз? :))
1 май 19, 13:47    [21876316]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

ASP.NET Core так-то это и есть консольное приложение. Сюрприз? :))

А я разве про core? Я про десктоп.
Флудить перестанешь?
1 май 19, 13:57    [21876323]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Petro123
Автору скажи - выкинь класс и возьми DI!!!

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

Откуда:
Сообщений: 1143
Petro123
Автору скажи - выкинь класс и возьми DI!!!

Так я это ему уже сказал. Выкинь статик и сделай синглетон. А чтобы не морочится с синглетоном используй DI. Или у него все настолько просто, что все приложение из одного этого класса, который два целых складывает? Ты сам-то вообще синглетон корректно сможешь написать? С ленивой инициализацией, потокобезопасностью и отсутствием лишних оверхедов на блокировки (double null check)?
1 май 19, 13:58    [21876327]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
fkthat
Petro123
Автору скажи - выкинь класс и возьми DI!!!

Так я это ему уже сказал. Выкинь статик и сделай синглетон. А чтобы не морочится с синглетоном используй DI. Или у него все настолько просто, что все приложение из одного этого класса, который два целых складывает? Ты сам-то вообще синглетон корректно сможешь написать? С ленивой инициализацией, потокобезопасностью и отсутствием лишних оверхедов на блокировки (double null check)?

Ни написать, ни нагуглить, ни в исходники посмотреть не сможет.
1 май 19, 14:00    [21876330]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
Попроси Дмитрий Мух тебя в java сводить.
Он пытается что там сказать, но неполучается.
Попробуйте вдвоем, про DI там ляпнуть.
1 май 19, 14:00    [21876331]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Так я это ему уже сказал.
нет. Ты начал мне доказывать и в глаза смотреть.
Зачем?
Я считаю оверхедом.
А ты бутылку полез меня обсуждать как шантропа.
Вот и все.
1 май 19, 14:03    [21876333]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
fkthat,
Попроси Дмитрий Мух тебя в java сводить.
Он пытается что там сказать, но неполучается.
Попробуйте вдвоем, про DI там ляпнуть.

А зачем мне жава - я ей не занимаюсь и не планирую заниматься. Ты еще предложи мне в ФоксПро сходить ))
1 май 19, 14:03    [21876334]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
Не нужна java - не пипикай про не как тут дети лейтенанта шмидта.
1 май 19, 14:05    [21876335]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
fkthat,
Не нужна java - не пипикай про не как тут дети лейтенанта шмидта.

А где я про вашу джабу что-то говорил? :-O
Я, в отличии от тебя, рулю, в чем я разбираюсь, а в чем нет.
1 май 19, 14:43    [21876350]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
рулю, в чем я разбираюсь, а в чем нет.
полез учить статик классам, никогда не писавший ГУИ.
Да у тебя от ASP подходов давно мозк ничего не видит кроме main() {}
Нужна глобальная, а он конструктор воткнул и флаг инициализации.
Ты еще фабрику сюда подгони.
Утомил.
1 май 19, 15:50    [21876379]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Petro123
Теперь что? Статический класс не использовать?

да
1 май 19, 15:51    [21876380]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил
Petro123
Теперь что? Статический класс не использовать?

да

молодец. Один кто тут не флудит).
Кто ещё скажет что не использует у себя в проектах?
1 май 19, 16:02    [21876386]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
полез учить статик классам, никогда не писавший ГУИ.

Да-да, подучи. А то тебя даже возможность наличия у него конструктора удивляет
1 май 19, 16:03    [21876387]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
iskatelsql
Есть статический класс, к примеру

тут есть мнение что нельзя его использовать.))
1 май 19, 16:03    [21876388]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

Чо? У меня все консольные утилиты и те с DI пишутся.

ещё раз - ты джун в больших ГУИ-Десктоп приложениях.
1 май 19, 16:04    [21876389]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
у него конструктора удивляет Картинка с другого сайта.
меня нет. Я знаю об этом. А вот ты джун в десктопе.
1 май 19, 16:05    [21876390]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
fkthat
у него конструктора удивляет Картинка с другого сайта.
меня нет. Я знаю об этом. А вот ты джун в десктопе.

В рисовании форм на Дельфи? Дай-то бог таким же джуном и дальше оставаться
1 май 19, 16:08    [21876393]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
В рисовании форм на Дельфи?
ты про Java пофлудил. Теперь про дельфи.
Так держать. Не отличающий Core от десктопа и консоль от десктопа.
1 май 19, 16:10    [21876394]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
А как тебе удаётся ООП продвигать в консольных утилитах. Расскажи)
1 май 19, 16:11    [21876395]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
fkthat,
А как тебе удаётся ООП продвигать в консольных утилитах. Расскажи)

Милейший, скажите, вы дурак?
1 май 19, 16:23    [21876398]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
fkthat,
А как тебе удаётся ООП продвигать в консольных утилитах. Расскажи)

Угомонись уже. Ты своей глупостью зафлудил уже все темы, и весь скуль превратил в один большой ПТ.
1 май 19, 16:26    [21876399]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20323
Изопропил
Petro123
Теперь что? Статический класс не использовать?

да
+1 кстати

Статические классы только для методов расширения.
1 май 19, 16:37    [21876404]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro
Статические классы только для методов расширения.

а как же математика? Пересчет координат?
Или всё таки есть исключения?
))
1 май 19, 16:39    [21876407]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Статические классы это замена макросов из С++
Милые мои дети.
1 май 19, 16:48    [21876409]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Изопропил
Member

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

ООП как-то зависит от использования в вебе,консоли или десктопе?
1 май 19, 16:49    [21876410]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Petro123
Статические классы это замена макросов из С++
Милые мои дети.

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

Откуда:
Сообщений: 1143
Изопропил
Petro123,

ООП как-то зависит от использования в вебе,консоли или десктопе?

Конечно. В десктопе, например, нельзя DI, а в консоли нельзя ООП.
1 май 19, 16:58    [21876415]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
а как же математика? Пересчет координат?

Да точно так же. Тебе есть разница вызывать ".Sin(x)" как статический метод статического класса, или как обычный метод объекта?
1 май 19, 17:03    [21876418]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил,
Да. А ты серьезно ни ни статический?
1 май 19, 17:16    [21876428]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
Мальчик иди гуляй со своей консолью.
1 май 19, 17:17    [21876431]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26479
Petro123
fkthat,
А как тебе удаётся ООП продвигать в консольных утилитах. Расскажи)

Интересно, если пациенту рассказать про внедрение зависимостей и модульное тестирование PowerShell утилит, то ему совсем поплохеет? Картинка с другого сайта.
1 май 19, 17:54    [21876457]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Petro123
Изопропил,
Да. А ты серьезно ни ни статический?

ну почему ни-ни

математика, логгеры...

а вот MessageBox.Show - только по приговору суда...
1 май 19, 18:05    [21876465]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
skyANA
Petro123
fkthat,
А как тебе удаётся ООП продвигать в консольных утилитах. Расскажи)

Интересно, если пациенту рассказать про внедрение зависимостей и модульное тестирование PowerShell утилит, то ему совсем поплохеет? Картинка с другого сайта.

DI выяснилось, все-таки в консоли можно. Его только в десктопных приложениях нельзя.
1 май 19, 18:05    [21876467]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Изопропил
математика, логгеры...

Для математики тоже имеет смысл нестатика. Хочу, например, экспоненту вычислять двумя разными способами (напр. таблица с нтерполяцией и ряд Тейлора), и способ этот в рантайме выбирать из списка, и точность при этом задавать из конфига. Наш Маг Десктопа тут, наверняка, просто возьмет и switch нарисует на полдюжины экранов. Ему так чувство прекрасного велит, или что там ему DI никак не дает использовать, уже не упомню.
1 май 19, 18:16    [21876472]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил
а вот MessageBox.Show - только по приговору суда...
поподробнее. Не понял. У меня на нем просто обертка чтобы покороче было. А макросов нету).
Длинные тексты строковые константы тоже в статик классе.
Расшифровка сфероида координат в виде строки. Константа.

Изопропил
ну почему ни-ни

математика, логгеры...
у вас своей математики нету?
1 май 19, 18:19    [21876473]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил,
Мне кажется MessageBox все модифицируют от минимума до полного переписывания.
У меня минимум в виде статик метода в своем статическом. Внутри метода вызов его родного и нативного. Либо с кнопкой подробности из расширения винды дллки.
1 май 19, 18:31    [21876480]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
Изопропил,
Мне кажется MessageBox все модифицируют от минимума до полного переписывания.
У меня минимум в виде статик метода в своем статическом. Внутри метода вызов его родного и нативного. Либо с кнопкой подробности из расширения винды дллки.

А у тебя никаких мыслей нет, зачем MessageBox имело бы смысл делать нестатическим?
1 май 19, 19:08    [21876505]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26479
fkthat
Petro123
Изопропил,
Мне кажется MessageBox все модифицируют от минимума до полного переписывания.
У меня минимум в виде статик метода в своем статическом. Внутри метода вызов его родного и нативного. Либо с кнопкой подробности из расширения винды дллки.

А у тебя никаких мыслей нет, зачем MessageBox имело бы смысл делать нестатическим?

Человек занят разработкой больших ГУИ-Десктоп приложений. Зачем ему о какой-то фигне думать?
В больших ГУИ-Десктоп приложених много кнопок, а, следовательно и баттонкликов, по которым надо много-много логики размазать.
Всё остальное оверхед и плохой вкус.
1 май 19, 19:16    [21876512]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
Иди гуляй. Или садомазохист приставать?
1 май 19, 19:26    [21876518]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat
Petro123
fkthat,
Какой DI в десктопе.

Чо? У меня все консольные утилиты и те с DI пишутся.

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

Откуда:
Сообщений: 1143
ЕвгенийВ
di контейнеры зло


Ты дженерики уже выучил? Или тоже зло?
6 май 19, 09:57    [21878441]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat
Изопропил
математика, логгеры...

Для математики тоже имеет смысл нестатика. Хочу, например, экспоненту вычислять двумя разными способами (напр. таблица с нтерполяцией и ряд Тейлора), и способ этот в рантайме выбирать из списка, и точность при этом задавать из конфига. Наш Маг Десктопа тут, наверняка, просто возьмет и switch нарисует на полдюжины экранов. Ему так чувство прекрасного велит, или что там ему DI никак не дает использовать, уже не упомню.

А как ты без статики вызовешь например эту прекрасную функцию?
6 май 19, 10:00    [21878444]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat
ЕвгенийВ
di контейнеры зло


Ты дженерики уже выучил? Или тоже зло?

При чем тут дженерики?
ДИ контейнеры очередная модная тема и все
6 май 19, 10:04    [21878447]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ЕвгенийВ
ДИ контейнеры очередная модная тема и все

Много у тебя видать времени ушло чтобы проспаться. Этой "модной" теме уже лет 15 как, не меньше.
6 май 19, 10:20    [21878462]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ЕвгенийВ
fkthat
пропущено...

Для математики тоже имеет смысл нестатика. Хочу, например, экспоненту вычислять двумя разными способами (напр. таблица с нтерполяцией и ряд Тейлора), и способ этот в рантайме выбирать из списка, и точность при этом задавать из конфига. Наш Маг Десктопа тут, наверняка, просто возьмет и switch нарисует на полдюжины экранов. Ему так чувство прекрасного велит, или что там ему DI никак не дает использовать, уже не упомню.

А как ты без статики вызовешь например эту прекрасную функцию?

Статический DllImport плюс нестатическая обертка к нему. В чем проблема?
6 май 19, 10:27    [21878473]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6186
Petro123
В с++ нет статических классов, но есть макросы.
В шарпе нет макросов, но есть статические классы.
И оба мучаются))))

Куда пропали ? https://ideone.com/Mp07ks

DI выглядит как Барон Мюнхгаузен, кусающий себя за жо вытаскивающий себя за волосы.

Далеко не везде нужно ЭТО совать.
6 май 19, 13:25    [21878798]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Hexag0v
Member

Откуда:
Сообщений: 13
Siemargl
DI выглядит как Барон Мюнхгаузен, кусающий себя за жо вытаскивающий себя за волосы.

Далеко не везде нужно ЭТО совать.


Не надо там, где не надо. Свежий взгляд, Кэп. )
6 май 19, 14:14    [21878907]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
Shocker.Pro
Изопропил
пропущено...

да
+1 кстати

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

Откуда:
Сообщений: 1143
Antonariy
Shocker.Pro
пропущено...
+1 кстати

Статические классы только для методов расширения.
почему?


"Наша песня хороша, начинай сначала" (с)
6 май 19, 22:05    [21879417]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat
Antonariy
пропущено...
почему?


"Наша песня хороша, начинай сначала" (с)

Ага, это зачем ввели?
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8#static-local-functions
6 май 19, 22:36    [21879434]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ЕвгенийВ
Ага, это зачем ввели?
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8#static-local-functions

Слышал звон. Static local functions не имеюют никакого отношения к статическим классам или методом. Это просто локальные функции не имеющие доступа к замыканию. Для гарантии отсутствия их побочных эффектов. А статический класс это по сути самая что ни на есть глобальная переменная, которая прямо-таки тянет на то эти самые побочные эффекты наплодить. Но, лично мне, достаточно уже того, что со всем, что использует статические классы, возникает полная жоппа с юнит-тестированием. Тут уже на пяти страницах это обсуждалось, надоело повторяться.

class Person
{
    public DateTime DateOfBirth { get; private set; }

    public DateTimeSpan Age => DateTime.Now - DateOfBirth;
}


А теперь давай, расскажи, как ты будешь писать тесты на свойство "Age"
6 май 19, 23:47    [21879466]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
На пяти страницах был срач с Петей, полный уныния и неочевидности. Точно так же не очевидна жопа с юнит-тестированием.
7 май 19, 06:44    [21879531]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
Antonariy,
Да пусть не используют.
Джунам глобальные переменные использовать нельзя).
7 май 19, 07:04    [21879538]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
WebPrj
Джунам глобальные переменные использовать нельзя).

Только начиная с синьора. А лиды, так те вообще пишут все только на статических классах. Да.
7 май 19, 08:22    [21879563]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
Вообще меня объяснения Шокера интересовали, он-то адекватно свои слова обосновывает.
7 май 19, 13:20    [21879839]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3350
fkthat
А теперь давай, расскажи, как ты будешь писать тесты на свойство "Age"
mock сборка. с датами и без статики гемороя много.
и DateTime это не статический класс, даже не класс, по этому к чему он в этой теме? Поля статически у него имеются.
автор
А статический класс это по сути самая что ни на есть глобальная переменная, которая прямо-таки тянет на то эти самые побочные эффекты наплодить.
абсолютно любой тип, статический или нет, после инициализации является глобальным объектом, в котором хранится его TypeHandler, ссылки на методы и поля, у него есть адрес и т.д. По этому, любой тип по сути является глобальной переменной, не только статический.
7 май 19, 14:40    [21879982]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Roman Mejtes
mock сборка. с датами и без статики гемороя много.

Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
[Fact]
public void TestAge()
{
    var mockClock = new Mock<ISystemClock>(); 
    mockClock.Setup(m => m.GetCurrentDateTime()).Returns(new DateTime(2019, 1, 1));
    var person = new Person(mockClock.Object);
    person.DateOfBirth = new DateTime(2000, 1, 1);
    person.Age.Should().Be(19);
}

Вот и все, никаких каких-то сборок.
7 май 19, 15:14    [21880048]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Roman Mejtes
абсолютно любой тип, статический или нет, после инициализации является глобальным объектом, в котором хранится его TypeHandler, ссылки на методы и поля, у него есть адрес и т.д. По этому, любой тип по сути является глобальной переменной, не только статический.

Ога. И вообще любой объект (reference type) хранится в куче, котрая является одним огромным глобальным объектом. Этак можно вообще до единой теории всего дофилософствоваться.
7 май 19, 15:17    [21880056]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
fkthat
Roman Mejtes
mock сборка. с датами и без статики гемороя много.

Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
[Fact]
public void TestAge()
{
    var mockClock = new Mock<ISystemClock>(); 
    mockClock.Setup(m => m.GetCurrentDateTime()).Returns(new DateTime(2019, 1, 1));
    var person = new Person(mockClock.Object);
    person.DateOfBirth = new DateTime(2000, 1, 1);
    person.Age.Should().Be(19);
}

Вот и все, никаких каких-то сборок.


Скайна как-то это обозвал, уродством, кажется
7 май 19, 15:20    [21880060]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
love_bach
fkthat
пропущено...

Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
[Fact]
public void TestAge()
{
    var mockClock = new Mock<ISystemClock>(); 
    mockClock.Setup(m => m.GetCurrentDateTime()).Returns(new DateTime(2019, 1, 1));
    var person = new Person(mockClock.Object);
    person.DateOfBirth = new DateTime(2000, 1, 1);
    person.Age.Should().Be(19);
}


Вот и все, никаких каких-то сборок.


Скайна как-то это обозвал, уродством, кажется

Это вообще-то тупо тест.
А вот зачем понадобился интерфейс ISystemClock в реальном проекте - так и не ответили в тот раз.
Сложилось впечатление, что сначала напроектировали фигни, а потом с ней героически боролись.
7 май 19, 15:24    [21880063]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
И виновником помнится оказались не static-и, а люди, кто применял их фиг пойми как и зачем.
7 май 19, 15:25    [21880065]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Дмитрий Мух
Это вообще-то тупо тест.
А вот зачем понадобился интерфейс ISystemClock в реальном проекте - так и не ответили в тот раз.
Сложилось впечатление, что сначала напроектировали фигни, а потом с ней героически боролись.

Понадобился в основном как раз для того, чтобы покрыть тестами весьма критическую часть проекта. Код все это совершенно не усложняет, ибо везде DI
public interface ISystemClock {
    DateTime GetCurrentDateTime();
}

public class SystemClock: ISystemClock {
    public DateTime GetCurrentDateTime() => DateTime.Now;
}

containerBuilder.RegisterType<SystemClock>().As<ISystemClock>().SingleInstance();


Вот и весь код. Полдюжины строчек кода, которые решают кучу проблем с тестами. Под такую же херь, кстати, попадает еще всякая шляпа, типа Guid.New(), Random.Next() и т.п. - в общем вся хрень, результат которой ты никак не можешь в случае надобности контролировать.
7 май 19, 16:06    [21880118]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3350
Random имеет Seed, можно получить заданную последовательность псевдослучайных чисел, которая будет всегда постоянной...
7 май 19, 16:22    [21880134]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Roman Mejtes
Random имеет Seed, можно получить заданную последовательность псевдослучайных чисел, которая будет всегда постоянной...

Это да. Но все равно через seed не получить какую-то предопределенную последовательность для теста. Впрочем, в крайних версиях фреймворка и коре рандом уже сделали с виртуальными методами. Примерно так же как в свое время сделали с HttpContext для тех же целей.
7 май 19, 16:51    [21880167]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Потом еще такая шляпа. Вполне может захотется сменить Random на секьюрный RandomNumberGenerator. Или вообще в одних местах использовать обычный, а в других секьюрный. С инжекцией это можно сделать букально за минуты.
7 май 19, 17:00    [21880173]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20323
Antonariy
Shocker.Pro
пропущено...
+1 кстати

Статические классы только для методов расширения.
почему?
Antonariy
Вообще меня объяснения Шокера интересовали, он-то адекватно свои слова обосновывает.
Ну, по большей части, уже объяснили конкретно.
Это как взрослый на основе своего опыта говорит ребенку "не носись", но сложно объяснить конкретно... потому что упадет и расквасит нос, потому что может попасть под машину, потому что собака рядом бегает без намордника....

В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на грабли
7 май 19, 19:55    [21880359]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
Shocker.Pro

В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на грабли

Что грабли?
8 май 19, 09:15    [21880633]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
ЕвгенийВ,
"Суслика видишь?")
8 май 19, 09:54    [21880678]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
Shocker.Pro
Antonariy
пропущено...
почему?
Antonariy
Вообще меня объяснения Шокера интересовали, он-то адекватно свои слова обосновывает.
Ну, по большей части, уже объяснили конкретно.
Это как взрослый на основе своего опыта говорит ребенку "не носись", но сложно объяснить конкретно... потому что упадет и расквасит нос, потому что может попасть под машину, потому что собака рядом бегает без намордника....

В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на грабли
В общем, я понял:
Дмитрий Мух
И виновником помнится оказались не static-и, а люди, кто применял их фиг пойми как и зачем.


Ложная тревога, все в порядке со статиками.
8 май 19, 11:06    [21880761]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
Antonariy
В общем, я понял:

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

Откуда:
Сообщений: 1143
ЕвгенийВ
Antonariy
В общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.

Повернутые на оптимизации? Я в жизни не видал, чтобы проблемы с перформансом были именно из-за использования нестатиков вместо статиков. Вот из-за чего угодно видал, но только не из-за этого. Ты еще начни сравнивать сколько процессорных тактов на тот или иной вызов уходит.
8 май 19, 14:01    [21881028]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

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

Зато много раз видал, как из-за статиков утечки памяти возникают. Утечки памяти на платформе со сборкой мусора, Карл. Собственно, статик это фактически, наверное, единственный способ утечку памяти вызвать. Хотя, если, честно, то с синглетоном тоже такую бяку легко сделать.
8 май 19, 14:03    [21881034]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

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

Зато много раз видал, как из-за статиков утечки памяти возникают. Утечки памяти на платформе со сборкой мусора, Карл. Собственно, статик это фактически, наверное, единственный способ утечку памяти вызвать. Хотя, если, честно, то с синглетоном тоже такую бяку легко сделать.

А ну ка друг мой, приведи работающий пример утечки памяти из за статиков.
8 май 19, 14:39    [21881111]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

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

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.

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

      static void StaticMethod()
        { }
       void NonStaticMethod()
        { }

        static void Main(string[] args)
        {
            Program program = new Program();
            StaticMethod();
            program.NonStaticMethod();

// Program program = new Program();
	IL_0001: newobj instance void ConsoleApp2.Program::.ctor()
	IL_0006: stloc.0
	// StaticMethod();
	IL_0007: call void ConsoleApp2.Program::StaticMethod()
	// (no C# code)
	IL_000c: nop
	// program.NonStaticMethod();
	IL_000d: ldloc.0
	IL_000e: callvirt instance void ConsoleApp2.Program::NonStaticMethod()
	// (no C# code)

callvirt - Карл!
8 май 19, 14:47    [21881123]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
ЕвгенийВ
Antonariy
В общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.
А я от них и не бегал) Наоборот, заметил панику в этой теме - "только для расширений!!11".
8 май 19, 14:47    [21881124]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
Плюс
IL_0001: newobj instance void ConsoleApp2.Program::.ctor()
	IL_0006: stloc.0
8 май 19, 14:48    [21881127]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

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

Зато много раз видал, как из-за статиков утечки памяти возникают. Утечки памяти на платформе со сборкой мусора, Карл. Собственно, статик это фактически, наверное, единственный способ утечку памяти вызвать. Хотя, если, честно, то с синглетоном тоже такую бяку легко сделать.

А ну ка друг мой, приведи работающий пример утечки памяти из за статиков.


class Foo {
    private static List<Foo> _theListOfAllFoo = new LIst<Foo>();

    private byte[] _someVeryLargeArray = new byte[100500];  

    public Foo() {
        _theListOfAllFoos.Add(this);
    }
}

for(var i = 0; i < 100500; i++) {
    new Foo();
}

Наиболее часто встречающаяся ситуация сродни этой - это подписаться на какой-нибудь статический ивент, а потом от него не отписаться.
8 май 19, 14:58    [21881144]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
Проще говоря вызов через инстанц.
1. Создание объекта - выделение памяти.
2. Сохранение ссылки на него в памяти.
3. Извлечение ссылки из памяти в стек (this передается первым параметром в метод)
4. Поиск ссылки на метод в таблице виртуальных методов
5. Вызов метода
6. GC собирает объект

Это те пункты, которых не будет при вызове статик метода.

Не нужен в методе this - делай статик!
Нужен простой публичный утилитный метод - суй его в статик класс.
8 май 19, 14:59    [21881148]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat
class Foo {
    private static List<Foo> _theListOfAllFoo = new LIst<Foo>();

    private byte[] _someVeryLargeArray = new byte[100500];  

    public Foo() {
        _theListOfAllFoos.Add(this);
    }
}

for(var i = 0; i < 100500; i++) {
    new Foo();
}


Ты привел очень сложный пример, попробуй так
ulong[] arr = new ulong[ulong.MaxValue];

Не путай нехватку памяти и утечку памяти.
8 май 19, 15:03    [21881159]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ЕвгенийВ
callvirt - Карл!

Что мне твой машинный код - ты приведи реальный пример из жизни, когда бы статик/нестатик реально влиял на производительность. Так и представил себе какое-нибудь десктопное приложение тормозящее из-за того что там вместо статиков нестатики. А сallvirt ничего не означает - он используется для вызова любого инстанс-метода, хоть виртуального, хоть нет. Вызываются они при этои по разному. Иначе все методы были бы виртуальными, как в Java, кажись - кстати, что-то не слышал, чтобы они из-за этого изстрадались.
8 май 19, 15:04    [21881162]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ЕвгенийВ
Не нужен в методе this - делай статик!
Нужен простой публичный утилитный метод - суй его в статик класс.


И пиши все на статиках, блеат. Ога. :- D
8 май 19, 15:06    [21881164]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3350
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое
8 май 19, 15:08    [21881170]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ЕвгенийВ
Не путай нехватку памяти и утечку памяти.

Там и есть именно утечка памяти. Но, поскольку, судя по твоему прошлому сообщению ты имеешь очень слабое представление о том как на самом деле в .NET работает выделение памяти и GC, то объяснять тебе тут это получится слишком долго. Начни лучше с чтения Рихтера, что ли.
8 май 19, 15:10    [21881175]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.
8 май 19, 15:14    [21881185]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
fkthat
ЕвгенийВ
callvirt - Карл!

Что мне твой машинный код - ты приведи реальный пример из жизни, когда бы статик/нестатик реально влиял на производительность. Так и представил себе какое-нибудь десктопное приложение тормозящее из-за того что там вместо статиков нестатики. А сallvirt ничего не означает - он используется для вызова любого инстанс-метода, хоть виртуального, хоть нет. Вызываются они при этои по разному. Иначе все методы были бы виртуальными, как в Java, кажись - кстати, что-то не слышал, чтобы они из-за этого изстрадались.


HttpClient
8 май 19, 15:42    [21881247]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
fkthat
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.


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

Откуда: ☭
Сообщений: 72736
fkthat
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.
Эти принципы придумали люди, исходя из собственной конкретной практики, которая может в значительной мере отличаться от любой другой практики. Слепое и маниакальное следование всем этим принципам превращает хэлло ворлд в многослойное говно, в котором абстракция на абстракции едет и абстракцией погоняет, в результате чего вообще непонятно, как это работает, и куда заныкана реализация. А если еще и DI прикручено - вообще туши свет.

Как раз с таким хелловорлдом я на днях мучался. Тот, кто его писал, по-моему применил все принципы, паттерны и бест-кейсы, которые знал. Казалось бы, тривиальная задача - сохранить дюжину настроек в xml: формочка + save/load, да еще до сервера достучаться, чтобы логин/пароль проверить. И задача эта разбита на 4 (четыре, карл!) проекта. В одном модели и абстракции для UI, в другом модели и абстракции для хранилища, 3 и 4, соответственно UI (из одной формочки) и хранилище. В результате workflow этого говна совершенно невразумительно. Не говоря уж о том, что на все 4 кучки нужны ссылки в основном проекте.
8 май 19, 15:53    [21881265]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
love_bach
fkthat
пропущено...


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.


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

да, да, ребята из stackoverflow по этой причине и не используют DI
правда нам до их нагрузок как пешком до Луны, но это же мелочи, правда? :)
8 май 19, 15:55    [21881268]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Antonariy
Эти принципы придумали люди, исходя из собственной конкретной практики, которая может в значительной мере отличаться от любой другой практики.

А инженеры Тойоты придумали что надо заправлять её 98-м бензином, потому что им это во сне приснилось. Но мы-то умнее их и лучше их машину знаем - так что будем экономить и в соседнем колхозе заливать 76-й.

Вот же белять, российский менталитет. Напиши человеку аршинным капсом, что сюда лезть нельзя, потому что током долбанет, но, он все равно решит, что ему виднее, чем тому, кто это писал и обязательно туда полезет.
8 май 19, 16:24    [21881315]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое

Статические поля - сразу же возможная засада с thread-safety.
8 май 19, 16:27    [21881317]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
love_bach
HttpClient


Cерьезно? HttpClient потенциально тормозной не из-за того что в интернет лезет, а из-за того, что он не статический? Ты хоть понял, что ты за бугагос сейчас написал?

Кстати, это еще один класс, который у нас везде завернут в обертку с интерфейсом. Ибо писать и гонять юнит-тесты, которые зависят от каких-то других сетевых сервисов, это было бы вообще писец. Точнее это были бы вообще даже близко не юнит тесты.
8 май 19, 16:31    [21881322]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
love_bach
лично я на затыки тут не натыкался

Первый же запрос к i/o (БД, хттп, файловая система) накроет все дополнительные расходы на виртуальные вызовы, DI и подобное, как бык овцу.
8 май 19, 16:38    [21881327]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
fkthat
Antonariy
Эти принципы придумали люди, исходя из собственной конкретной практики, которая может в значительной мере отличаться от любой другой практики.

А инженеры Тойоты придумали что надо заправлять её 98-м бензином, потому что им это во сне приснилось. Но мы-то умнее их и лучше их машину знаем - так что будем экономить и в соседнем колхозе заливать 76-й.
А я тоже могу придумать якобы аналогию, которая на самом деле нифига не аналогия, и выставить себя дураком. Но я-то умнее, поэтому делать этого не буду.

Автомобиль не поставляется в виде конструктора "сделай сам", в отличие от нашей предметной области.

fkthat
Вот же белять, российский менталитет. Напиши человеку аршинным капсом, что сюда лезть нельзя, потому что током долбанет, но, он все равно решит, что ему виднее, чем тому, кто это писал и обязательно туда полезет.
Глупость, написанная капсом, умностью не становится.
8 май 19, 16:44    [21881333]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
fkthat
love_bach
HttpClient


Cерьезно? HttpClient потенциально тормозной не из-за того что в интернет лезет, а из-за того, что он не статический? Ты хоть понял, что ты за бугагос сейчас написал?

Кстати, это еще один класс, который у нас везде завернут в обертку с интерфейсом. Ибо писать и гонять юнит-тесты, которые зависят от каких-то других сетевых сервисов, это было бы вообще писец. Точнее это были бы вообще даже близко не юнит тесты.


Ну вашето это не я только натыкался. Народ юзал Статик, и МС пошёл навстречу страждущим и сделал фабрику - тот же Статик, только с интеллигентным лицом
8 май 19, 16:47    [21881336]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Antonariy
Глупость, написанная капсом, умностью не становится.


Antonariy
Но я-то умнее


8 май 19, 17:16    [21881356]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
fkthat
love_bach
лично я на затыки тут не натыкался

Первый же запрос к i/o (БД, хттп, файловая система) накроет все дополнительные расходы на виртуальные вызовы, DI и подобное, как бык овцу.


ну, есть же поддержка async в проваедерах БД, хттп...
8 май 19, 18:29    [21881392]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
короче, я против статиков, я за IoC, но, есть же случаи, когда у кого-то, когда это не подходит :)
8 май 19, 18:32    [21881396]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
love_bach
но, есть же случаи, когда у кого-то, когда это не подходит :)

причины неиспользования срорее другие
8 май 19, 18:35    [21881398]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
love_bach
короче, я против статиков, я за IoC, но, есть же случаи, когда у кого-то, когда это не подходит :)

А как вы напишете это:
// mathematical.hpp
 
namespace Constants
{
  inline constexpr double pi{ 3.14159 };
  inline constexpr double avogadro{ 6.0221413e23 };
  inline constexpr double my_gravity{ 9.2 };
}
8 май 19, 18:51    [21881406]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
WebPrj
love_bach
короче, я против статиков, я за IoC, но, есть же случаи, когда у кого-то, когда это не подходит :)

А как вы напишете это:
// mathematical.hpp
 
namespace Constants
{
  inline constexpr double pi{ 3.14159 };
  inline constexpr double avogadro{ 6.0221413e23 };
  inline constexpr double my_gravity{ 9.2 };
}


скорее всего не на C#
8 май 19, 19:24    [21881420]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4820
fkthat
А сallvirt ничего не означает - он используется для вызова любого инстанс-метода, хоть виртуального, хоть нет.

Кстати, нет. Вызов прямо на результате конструктора приводит к использованию call вместо callvirt:
using System;
namespace test2
{
  class Program
  {
    public static void Main(string[] args)
    {
      new Program().Foo();
    }
    public void Foo() => Console.WriteLine("done");
  }
}

.method public hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Размер кода:       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  newobj     instance void test2.Program::.ctor()
  IL_0006:  call       instance void test2.Program::Foo()
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main

Оппонент просто какбы намекает, что если вдруг с какого-то мегаперепоя корвалолом все инстанстные вызовы заменятся на статики, то будет массовая замена вызовов callvirt на call. Цена замены - несколько тиков. В масштабах страны, сами понимаете результат.
8 май 19, 19:37    [21881429]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
love_bach
fkthat
пропущено...

Первый же запрос к i/o (БД, хттп, файловая система) накроет все дополнительные расходы на виртуальные вызовы, DI и подобное, как бык овцу.


ну, есть же поддержка async в проваедерах БД, хттп...

Асинк как-то ускорит выполнение самого запроса?
8 май 19, 19:38    [21881430]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
fkthat
love_bach
пропущено...


ну, есть же поддержка async в проваедерах БД, хттп...

Асинк как-то ускорит выполнение самого запроса?
Не, только если на Go переписать :)
8 май 19, 19:39    [21881431]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Ололо, оптимизаторы тактов вызова метода. Объясняйте мне тогда вот это:
    internal class Program
    {
        private static void Static()
        {
        }

        private static void Main(string[] args)
        {
            var prog = new Program();
            var n = 100500000;
            Console.WriteLine("Static:     {0}", Measure(() => Repeat(n, Static)));
            Console.WriteLine("Not static: {0}", Measure(() => Repeat(n, prog.NotStatic)));
        }

        private static void Repeat(int n, Action action)
        {
            for (var i = 0; i < n; i++)
            {
                action();
            }
        }

        private static TimeSpan Measure(Action action)
        {
            var sw = new Stopwatch();
            sw.Start();
            action();
            sw.Stop();
            return sw.Elapsed;
        }

        private void NotStatic()
        {
        }
    }


Static:     00:00:00.5190127
Not static: 00:00:00.4082426


И так не на одном запуске, а раз за разом. Нестатический метод вызывается быстрее чем статический. Причем и в дебажной и релизной сборке. Честно говоря, для меня это тоже полный сюрприз.
8 май 19, 20:01    [21881446]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Добавим жару.

        public virtual void Virtual()
        {
        }


Static:     00:00:00.3154586
Not static: 00:00:00.2473785
Virtual:    00:00:00.2532572


Даже виртуальный метод имеет статика в хвост и гриву
8 май 19, 20:06    [21881455]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4820
fkthat
Объясняйте мне тогда вот это

Зачем? Мне это вообще по барабану. Моя деятельность оценивается несколько по-другому.
8 май 19, 20:08    [21881458]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
love_bach
WebPrj
пропущено...

А как вы напишете это:
// mathematical.hpp
 
namespace Constants
{
  inline constexpr double pi{ 3.14159 };
  inline constexpr double avogadro{ 6.0221413e23 };
  inline constexpr double my_gravity{ 9.2 };
}


скорее всего не на C#

А я думал
static class Constants
{
8 май 19, 20:09    [21881459]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
И даже так

    internal interface IProgram
    {
        void Interface();
    }

    internal class Program : IProgram
    {
        public void Interface()
        {
        }


Static:     00:00:00.3932091
Not static: 00:00:00.2832406
Virtual:    00:00:00.2452205
Interface:  00:00:00.2511343


Статик самый медленный. Причем, что интересно, что вызовы виртуального метода и метода интерфейса быстрее чем обычного.
8 май 19, 20:14    [21881466]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Сон Веры Павловны
fkthat
Объясняйте мне тогда вот это

Зачем? Мне это вообще по барабану. Моя деятельность оценивается несколько по-другому.

Ну тогда можешь скипать. Просто тут был пассажир, который объяснял что статик метод лучше, потому что его вызов быстрее. Даже какой-то машинный код тут в доказательство писал.
8 май 19, 20:15    [21881468]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9536
Дмитрий Мух
fkthat
пропущено...

Асинк как-то ускорит выполнение самого запроса?
Не, только если на Go переписать :)

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

Откуда:
Сообщений: 1143
WebPrj
А я думал
static class Constants
{


public interface IMathConstant {
    double Value {get;}
}

public class PIMathConstants: IMathConstants {
   public double Value => 3.14159;
}

public class GravyMathConstant: IMathConstant {
   public double Value => 9.8;
}

public interface IMathConstantLocator {
   IMathConstant Get(string name);
}

public class MathConstantLocator: IMathConstantLocator {
   privat IComponentContext _ctx;
   public MathConstantLocator(IComponentContext ctx) { _ctx = ctx; }
   public IMathConstant Get(string name) => _ctx.ResolveNamed(name);
}

containerBuilder.RegisterType<PIMathConstants>().As<IMathConstants>().SingleInstance();
containerBuilder.RegisterType<GravyMathConstants>().As<IMathConstants>().SingleInstance();
containerBuilder.RegisterType<MathConstantLocator>().As<IMathConstantLocator>();
8 май 19, 20:31    [21881473]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4820
Вундербар
fkthat
WebPrj
А я думал
static class Constants
{


public interface IMathConstant {
    double Value {get;}
}

public class PIMathConstants: IMathConstants {
   public double Value => 3.14159;
}

public class GravyMathConstant: IMathConstant {
   public double Value => 9.8;
}

public interface IMathConstantLocator {
   IMathConstant Get(string name);
}

public class MathConstantLocator: IMathConstantLocator {
   privat IComponentContext _ctx;
   public MathConstantLocator(IComponentContext ctx) { _ctx = ctx; }
   public IMathConstant Get(string name) => _ctx.ResolveNamed(name);
}

containerBuilder.RegisterType<PIMathConstants>().As<IMathConstants>().SingleInstance();
containerBuilder.RegisterType<GravyMathConstants>().As<IMathConstants>().SingleInstance();
containerBuilder.RegisterType<MathConstantLocator>().As<IMathConstantLocator>();

Главное, в процессе создания такой нетленки не забыть вот про [url=Вундербар
fkthat
WebPrj
А я думал
static class Constants
{


public interface IMathConstant {
    double Value {get;}
}

public class PIMathConstants: IMathConstants {
   public double Value => 3.14159;
}

public class GravyMathConstant: IMathConstant {
   public double Value => 9.8;
}

public interface IMathConstantLocator {
   IMathConstant Get(string name);
}

public class MathConstantLocator: IMathConstantLocator {
   privat IComponentContext _ctx;
   public MathConstantLocator(IComponentContext ctx) { _ctx = ctx; }
   public IMathConstant Get(string name) => _ctx.ResolveNamed(name);
}

containerBuilder.RegisterType<PIMathConstants>().As<IMathConstants>().SingleInstance();
containerBuilder.RegisterType<GravyMathConstants>().As<IMathConstants>().SingleInstance();
containerBuilder.RegisterType<MathConstantLocator>().As<IMathConstantLocator>();

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

Откуда:
Сообщений: 1143
Сон Веры Павловны

Ну ты не сравнивай "Hello factorial" и приложения, которые по десятку лет пишут, развивают и дорабатывают. Я бы мог кучу преимуществ своего примера кода привести над твоим static Consts, но, судя по твоей ссылке у тебя представление о разработке как раз такими "Hello factorial" и ограничивается, т.ч. тебе это все равно будет без пользы.
8 май 19, 21:43    [21881510]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
кто победил, потом отпишитесь
8 май 19, 22:59    [21881550]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 483
fkthat
Сон Веры Павловны

Ну ты не сравнивай "Hello factorial" и приложения, которые по десятку лет пишут, развивают и дорабатывают. Я бы мог кучу преимуществ своего примера кода привести над твоим static Consts, но, судя по твоей ссылке у тебя представление о разработке как раз такими "Hello factorial" и ограничивается, т.ч. тебе это все равно будет без пользы.


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

Откуда:
Сообщений: 1143
love_bach
чо то ты запизделси

Иди себе с миром писать еще один факториал на статиках :))
8 май 19, 23:41    [21881559]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
iskatelsql
Member

Откуда:
Сообщений: 783
Да блин, задал я вопросик... Семь страниц. одного заблокировали... Я вас уже что-то боюсь.
9 май 19, 00:13    [21881566]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
buser
Member

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

не бойся... это от хорошой жизни, ну и с возрастом... на словоблудие тянет
9 май 19, 00:35    [21881575]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
buser,
С возрастом на максимализм и нравоучения тянет))
Это нельзя, этому лоботомию, этот с***а, тут я бы уволился и т.д.
9 май 19, 09:13    [21881635]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
fkthat
Antonariy
Глупость, написанная капсом, умностью не становится.


Antonariy
Но я-то умнее


Кажется, ты что-то осмысленное хотел написать, но хватило лишь на смайлик.
А впрочем, правильный подход. Смайликами очередную глупость не ляпнешь.
9 май 19, 12:40    [21881683]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Antonariy
Кажется, ты что-то осмысленное хотел написать, но хватило лишь на смайлик.
А впрочем, правильный подход. Смайликами очередную глупость не ляпнешь.


Да я и не спорю. Тут один ты у нас умный. Даже сам об этом написал.

Antonariy
Но я-то умнее


Забыл, наверное, дописать "всех".
9 май 19, 14:08    [21881723]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
fkthat
Antonariy
Кажется, ты что-то осмысленное хотел написать, но хватило лишь на смайлик.
А впрочем, правильный подход. Смайликами очередную глупость не ляпнешь.


Да я и не спорю. Тут один ты у нас умный. Даже сам об этом написал.

Antonariy
Но я-то умнее


Забыл, наверное, дописать "всех".
Ну вот, перешел на буквы, и опять облажался, аж дважды. Вернись к смайликам, не позорься. Ну или к коду, к нему тоже претензий нет.
9 май 19, 17:49    [21881824]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6186
fkthat
И даже так

    internal interface IProgram
    {
        void Interface();
    }

    internal class Program : IProgram
    {
        public void Interface()
        {
        }


Static:     00:00:00.3932091
Not static: 00:00:00.2832406
Virtual:    00:00:00.2452205
Interface:  00:00:00.2511343


Статик самый медленный. Причем, что интересно, что вызовы виртуального метода и метода интерфейса быстрее чем обычного.

Бред какой то. Протестируй нормально.

В любом случае, при такой разнице в пределах погрешности, скорость не аргумент. {C# и скорость ахах....}
10 май 19, 01:31    [21881973]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Siemargl
Бред какой то. Протестируй нормально.


Код я привел. Можешь сам его собрать, запустить и посмотреть

Siemargl
В любом случае, при такой разнице в пределах погрешности, скорость не аргумент.


Я тоже самое писал. Только некоторые стали тут доказывать что разница в несколько тактов на вызове метода это писец как важно.

Siemargl
C# и скорость ахах.


Есть ряд случаев, когда нетовский рантайм может уделать по производительности unmanaged языки.
10 май 19, 04:07    [21881980]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
Siemargl,
Да. Скорость не аргумент в данной теме.
Только как дымовая завеса при обсуждении.
10 май 19, 08:38    [21882013]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
WebPrj
Siemargl,
Да. Скорость не аргумент в данной теме.
Только как дымовая завеса при обсуждении.


Мне, однако, все-таки, пипец любопытно стало - как так выходит, что статический метод по вызову самый медленный. Релизная сборка, чистый запуск из командной строки - и он стабильно отстаёт по скорости от любого другого вызова в полтора раза.
10 май 19, 09:15    [21882024]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4401
fkthat, вы жо умный посмотрите во что скомпилилось... происки оптимизатора?
10 май 19, 10:39    [21882045]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4401
fkthat, вот тут простым языком немного общих рассуждений на эту тему... х.з. ни когда не приходилось биться за микросекунды... в основном исходят из здравого смысла, семантики самой задачи, а не тупо следуют скрижалям... так что спор инстанс вс статик - это спор между "тупоконечниками и остроконечниками"
10 май 19, 11:02    [21882049]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
buser
fkthat, вы жо умный посмотрите во что скомпилилось... происки оптимизатора?

Оптимизация дефолтная. Для чистоты эксперимента поставил еще аттрибуты
[MethodImpl(MethodImplOptions.NoInlining)]

и даже попробовал сделать наоборот
[MethodImpl(MethodImplOptions.AggressiveInlining)]

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

Собирал под .net core 3 и под обычный .net 4.6 и никакой разницы - везде статик тормозит.
10 май 19, 11:25    [21882061]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
fkthat,
Не знаю. Никогда не интересовало.
Как тут сказали, мне платят за другие вопросы)
10 май 19, 11:26    [21882062]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
buser
fkthat, вот тут простым языком немного общих рассуждений на эту тему


автор
In theory, a static method should perform slightly better than an instance method


Ну вот в том-то и дело, что "in theory", а вот я смотрю и вижу сейчас, что все совсем наоборот. Разница, конечно, совершенно ерундовая, как я уже говорил я бы даже внимания обращать на неё не стал бы никогда, но мне вот интересно, почему все-таки так получается.
10 май 19, 11:38    [21882070]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
ЕвгенийВ
Antonariy
В общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.

ваш взлетел? что за продукт? любопытно, какую архитектура и принципы разработки используете?
10 май 19, 11:58    [21882081]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9536
Дмитрий Мух
ЕвгенийВ
пропущено...

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.

ваш взлетел? что за продукт? любопытно, какую архитектура и принципы разработки используете?

мазохист
10 май 19, 16:46    [21882163]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
ViPRos
Дмитрий Мух
пропущено...

ваш взлетел? что за продукт? любопытно, какую архитектура и принципы разработки используете?

мазохист


Мазохизм - склонность получать удовольствие, испытывая унижения, насилие или мучения.

Что же из вышеперечисленного нас ожидает? Картинка с другого сайта.
10 май 19, 16:53    [21882167]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9536
Дмитрий Мух,

счас будет тебе делать мозги, а ты получишь от этого кайф
10 май 19, 16:59    [21882169]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
ViPRos
Дмитрий Мух,

счас будет тебе делать мозги, а ты получишь от этого кайф

Что мне будут делать? Выражайся, если можно, понятным языком.
10 май 19, 17:05    [21882171]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9536
Дмитрий Мух,

е***ь мозг всякими лаунчерами
10 май 19, 17:28    [21882180]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
ViPRos
Дмитрий Мух,

е***ь мозг всякими лаунчерами

ЕвгенийВ - это же не ВМоисеев. Я надеюсь :)
10 май 19, 17:41    [21882181]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9536
Дмитрий Мух
ViPRos
Дмитрий Мух,

е***ь мозг всякими лаунчерами

ЕвгенийВ - это же не ВМоисеев. Я надеюсь :)

ааааааааааа
перепутал, блин :)
10 май 19, 17:51    [21882189]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6186
fkthat
ЕвгенийВ
пропущено...

А ну ка друг мой, приведи работающий пример утечки памяти из за статиков.


class Foo {
    private static List<Foo> _theListOfAllFoo = new LIst<Foo>();

    private byte[] _someVeryLargeArray = new byte[100500];  

    public Foo() {
        _theListOfAllFoos.Add(this);
    }
}

for(var i = 0; i < 100500; i++) {
    new Foo();
}

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

Этот не утечка памяти. Здесь все указатели на выделенную память сохранены и могут быть освобождены в любой момент.
Утечка - это выделенная память, на которую нет указателей и программа потеряла над ней контроль.
11 май 19, 02:58    [21882336]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6186
fkthat
Siemargl
Бред какой то. Протестируй нормально.

Код я привел. Можешь сам его собрать, запустить и посмотреть

Проверил, добавил тестирование вызова стат.класса, попробовал убрать накладные от лямбды, исключить выбрасывание кода оптимизатором.
У меня в виртуалке (VS2017, release, NET4.6)
Not static: 00:00:00.3894198
Virtual: 00:00:00.5584478
Interface Call: 00:00:00.3800740
Static: 00:00:00.3692603

В ideone https://ideone.com/qTPeHC
Not static: 00:00:00.1811481
Virtual: 00:00:00.2084212
Interface Call: 00:00:00.1812678
Static: 00:00:00.1848647

Собственно, только виртуальный вызов заметно медленнее, остальное в пределах погрешностей
11 май 19, 03:53    [21882339]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Siemargl
Этот не утечка памяти. Здесь все указатели на выделенную память сохранены и могут быть освобождены в любой момент.
Утечка - это выделенная память, на которую нет указателей и программа потеряла над ней контроль.


Объекты Foo никогда освобождены не будут, потому что указатели на них сохранены в статической (т.е. глобальной переменной). Пока их оттуда руками не уберешь, то они так и будут там висеть, пока приложение не завершится. Если такая шляпа происходит, например в веб-приложении, то в итоге будет жопа - я на практике такое наблюдал и даже не раз. А так-то можно сказать, что, типа, да, утечек вообще никогда не бывает, потому что из приложения, типа, все равно когда-нибудь выйдем и память при этом освободится, по-твоему так, что ли?

Есть еще более смешная известная шляпа, называется "воскрешение объекта" ("object resurrection"). Правда, это уже из разряда извращений.

public class Foo {
    private static Foo _foo;

    ~Foo() {
        _foo = thiis;
    }
}


Объект, уже идя под сборку мусора, сам себя вытягивает за волосы. :))
11 май 19, 03:55    [21882340]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
fkthat
Siemargl
Этот не утечка памяти. Здесь все указатели на выделенную память сохранены и могут быть освобождены в любой момент.
Утечка - это выделенная память, на которую нет указателей и программа потеряла над ней контроль.


Объекты Foo никогда освобождены не будут, потому что указатели на них сохранены в статической (т.е. глобальной переменной). Пока их оттуда руками не уберешь, то они так и будут там висеть, пока приложение не завершится. Если такая шляпа происходит, например в веб-приложении, то в итоге будет жопа - я на практике такое наблюдал и даже не раз. А так-то можно сказать, что, типа, да, утечек вообще никогда не бывает, потому что из приложения, типа, все равно когда-нибудь выйдем и память при этом освободится, по-твоему так, что ли?

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

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

Результаты тестирования отменяются, оптимизатор выкинул _ВСЁ_

+
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Размер кода:       141 (0x8d)
  .maxstack  3
  .locals init ([0] class Program prog,
           [1] int64 result)
  IL_0000:  newobj     instance void Program::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldc.i4     0x5fd8220
  IL_000b:  conv.i8
  IL_000c:  stloc.1
  IL_000d:  ldloca.s   result
  IL_000f:  call       void SClass::StatClassCall(int64&)
  IL_0014:  ldstr      "Not static: {0}"
  IL_0019:  ldloc.0
  IL_001a:  ldloca.s   result
  IL_001c:  callvirt   instance valuetype [mscorlib]System.TimeSpan Program::NonStaticCall(int64&)
  IL_0021:  box        [mscorlib]System.TimeSpan
  IL_0026:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_002b:  ldstr      "Virtual: {0}"
  IL_0030:  ldloc.0
  IL_0031:  ldloca.s   result
  IL_0033:  callvirt   instance valuetype [mscorlib]System.TimeSpan Program::VirtCall(int64&)
  IL_0038:  box        [mscorlib]System.TimeSpan
  IL_003d:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
11 май 19, 09:14    [21882370]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6186
Хотя нет, показалось с непросыпу
Дебажная сборка тоже самое распределение
Not static: 00:00:02.1452922
Virtual: 00:00:02.2355484
Interface Call: 00:00:01.3028084
Static: 00:00:01.5658457
NNNs - 502500001, 0
11 май 19, 09:23    [21882373]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1970
>ViPRos, вчера, 17:28 [21882180]
>е***ь мозг всякими лаунчерами
<Интересно, чем же тебя так достал пускач. У меня инфосистема реализуется многими приложениями, а к ним надо иметь доступ, их надо запускать, надо смотреть за их изменениями. Этим и занимается лаунчар. Что здесь плохого - то?
11 май 19, 09:37    [21882376]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
WebPrj
Именно это и нужно программисту при статик.
Освобождение памяти при завершении процесса.

А серверных приложений у нас не бывает вообще? Или ты уроки, где про них рассказывали, прогулял? :))
11 май 19, 11:16    [21882391]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

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

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

public static class GlobalTimer {
    public static event EventHandler Tick;

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

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

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


Пользователь стопиццот раз откроет и закроет эту форму и все стопиццот экземпляров её объекта останутся висеть в памяти до конца работы приложения. Но это ведь тоже не утечка памяти, так ведь?
11 май 19, 14:08    [21882474]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
fkthat,
На оба твоих поста короткий ответ
1. Веб обсуждается в другой ветке.
2. Я глобальный таймер не ставлю.
11 май 19, 18:17    [21882528]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
WebPrj
fkthat
пропущено...


Объекты Foo никогда освобождены не будут, потому что указатели на них сохранены в статической (т.е. глобальной переменной). Пока их оттуда руками не уберешь, то они так и будут там висеть, пока приложение не завершится. Если такая шляпа происходит, например в веб-приложении, то в итоге будет жопа - я на практике такое наблюдал и даже не раз. А так-то можно сказать, что, типа, да, утечек вообще никогда не бывает, потому что из приложения, типа, все равно когда-нибудь выйдем и память при этом освободится, по-твоему так, что ли?

Именно это и нужно программисту при статик.
Освобождение памяти при завершении процесса.
повторяю. Это десктоп.
11 май 19, 18:19    [21882529]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

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

У тебя очень странные понятия о том, что такое "утечка памяти". Ладно, бог с тобой, переубеждать не буду - мне за это денег не платят.
11 май 19, 18:38    [21882533]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
fkthat,
Пример утечки?
Что есть по диагностике потребления памяти приложением?
11 май 19, 19:06    [21882541]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

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

Предлагаю тогда обратиться к разработчикам .NET c предложением вообще убрать оттуда GC - зачем там этот лишний оверхед.
11 май 19, 19:07    [21882542]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

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

Предлагаю тогда обратиться к разработчикам .NET c предложением вообще убрать оттуда GC - зачем там этот лишний оверхед.
оверхед это когда нет баланса преимущества - недостатки.
11 май 19, 19:20    [21882544]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
WebPrj
fkthat
WebPrj,

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

перечитал пять раз, ни фига не понял фразы
11 май 19, 19:43    [21882549]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
Дмитрий Мух,
Перевожу.
Нет баланса, это например, преимуществ не имеем или не требуется, а недостатки в наличии.
11 май 19, 19:47    [21882550]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9536
ВМоисеев
>ViPRos, вчера, 17:28 [21882180]
>е***ь мозг всякими лаунчерами
<Интересно, чем же тебя так достал пускач. У меня инфосистема реализуется многими приложениями, а к ним надо иметь доступ, их надо запускать, надо смотреть за их изменениями. Этим и занимается лаунчар. Что здесь плохого - то?

да ничего
просто мы это уже давно знаем
а тут Мух спросил именно про это (мне показалось)
оказалось вопрос был обращен не к тебе
11 май 19, 20:05    [21882554]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9536
fkthat
WebPrj
Именно это и нужно программисту при статик.
Освобождение памяти при завершении процесса.

А серверных приложений у нас не бывает вообще? Или ты уроки, где про них рассказывали, прогулял? :))

так и хотся бипнуть
мало того что фигни морозит, да еще и других пытается прибить
11 май 19, 20:08    [21882555]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
WebPrj
Дмитрий Мух,
Перевожу.
Нет баланса, это например, преимуществ не имеем или не требуется, а недостатки в наличии.

Дак найдите себе этот самый баланс, в чём проблема?
11 май 19, 20:50    [21882563]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
Дмитрий Мух,
У меня нет проблемы).
11 май 19, 21:25    [21882571]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6186
Дмитрий Мух
WebPrj
пропущено...
оверхед это когда нет баланса преимущества - недостатки.

перечитал пять раз, ни фига не понял фразы
Есть ручное управление, есть ARC, есть GC.
12 май 19, 00:09    [21882602]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6186
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, 00:39    [21882616]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
WebPrj
оверхед - это когда нет баланса между преимуществами и недостатками

если куча преимуществ - оверхед
если множество недостатков - оверхед

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

Откуда:
Сообщений: 1143
Siemargl
Именно так. Это не утечка, это архитектурный про*б.

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

Давай, без всякой оруелловщины обходиться, назови это как хочешь, но есть просто факт, что через статик можно легко получить ситуацию, когда уже ненужный объект остаётся в памяти и никогда не идёт в мусорку, пока процесс не завершается. Три раза за свою жизнь расследовал такую херь, и все три раза дело было в статиках.
12 май 19, 13:47    [21882739]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Кстати, статикофилы, если вы их так хорошо знаете, то сможете без гугла сказать, в чем отличие

static сlass Foo {
   public static int TheAnswerToEverything = 42;
}


и

static сlass Foo {
   public static int TheAnswerToEverything = 42;

   static Foo() {
      // Это действительно пустой конструктор
   }
}
12 май 19, 14:01    [21882746]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
WebPrj
2. Я глобальный таймер не ставлю.

Я понял. Ты герой-одиночка, что сам без команды пишет свою никому не нужную нетленку.
12 май 19, 14:04    [21882748]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
fkthat
Ты герой-одиночка, что сам без команды пишет свою никому не нужную нетленку.

Как быстро ты съехал на личности. Буквально на 4-м ходу в шахматы.
12 май 19, 15:42    [21882766]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
Дмитрий Мух,
Если вы сказали что непонимаете, зачем вы пытаетесь понять?
Siemargl все понял сразу).
12 май 19, 15:45    [21882768]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

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

Я понял. Ты герой-одиночка, что сам без команды пишет свою никому не нужную нетленку.
когда так отвечает ни разу не писавший десктоп, это смешно).
Продолжайте вдвоем.
12 май 19, 15:56    [21882771]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
WebPrj
Siemargl все понял сразу).
Крочавчег.
Зачастую случается угадывать то, что подразумевает человек, даже если он полную фигню говорит Картинка с другого сайта.

Вот опять, что за забавный вопрос:
WebPrj
Если вы сказали что непонимаете, зачем вы пытаетесь понять?"Если вы сказали что непонимаете, зачем вы пытаетесь понять?

Я написал, что не понимаю именно за тем, чтобы получить объяснение.
Вы с логикой вообще дружите?
12 май 19, 16:34    [21882792]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Petro123
когда так отвечает ни разу не писавший десктоп, это смешно).

Куда уж нам, дилетантам, до вашего десктопа и вашего "Button-click Driven Development".
12 май 19, 16:41    [21882797]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1712
Petro123
fkthat
пропущено...

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

Неделю в бане с нетерпением ждал, чтобы как попугай продолжить: "Ты десктоп не писал, десктоп не писал..." :)
12 май 19, 16:45    [21882802]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

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

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

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

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

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

Откуда:
Сообщений: 1143
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

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

+ Спойлер

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

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

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

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

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

Откуда:
Сообщений: 1143
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
Сообщений: 6186
fkthat
Я так понимаю, на вопрос, в чем разница между статиком без конструктора и статиком с конструктором (даже пустым), никто из поклонников статиков ответить так и не может? Как же вы так свой основной инструмент не знаете?

+ Спойлер

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

И ?

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

Откуда:
Сообщений: 1143
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
Сообщений: 6186
fkthat,

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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


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

Откуда: 010100
Сообщений: 6186
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
Сообщений: 6186
И 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

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

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

Откуда: Москва
Сообщений: 4673
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

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

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

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


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

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

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

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

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

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

Откуда: г. Пермь
Сообщений: 3350
мирные жители ложатся спать, мафия просыпается
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

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

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

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

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

Откуда: Москва
Сообщений: 4673
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

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

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

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

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

Откуда: Москва
Сообщений: 4673
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

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

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

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

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

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

Откуда: Москва
Сообщений: 4673
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

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

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

    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

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

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

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

Откуда: г. Пермь
Сообщений: 3350
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

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


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

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

Удивительное рядом. Это какой такой параметр?
14 май 19, 14:34    [21884466]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ЕвгенийВ
fkthat
Например, Lazy<T> имеет специальный параметр в конструкторе, который как раз позволяет то или иное поведение при неуспешной инициализации выбрать.

Удивительное рядом. Это какой такой параметр?

Функционал Lazy к данному топику вообще притянут за уши.
14 май 19, 14:39    [21884481]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
skyANA
Member

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

Удивительное рядом. Это какой такой параметр?

LazyThreadSafetyMode

- If the mode is LazyThreadSafetyMode.ExecutionAndPublication or LazyThreadSafetyMode.None, there is no second chance to initialize the Lazy<T> instance.
If an exception occurs and is unhandled in the initialization function, that exception is cached and rethrown on subsequent accesses of the Lazy<T>.Value property.
No value is created if an exception is thrown, so in such cases IsValueCreated returns false.

- If the mode is LazyThreadSafetyMode.PublicationOnly, the first thread that succeeds in running the initialization function (or the default constructor) creates the value for the Lazy<T> instance.
If the initialization function throws an exception on one thread, other threads can still try to initialize the Lazy<T> instance.
Until the value is created, the IsValueCreated property returns false.
14 май 19, 14:53    [21884499]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ЕвгенийВ
Это какой такой параметр?

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

Откуда:
Сообщений: 1143
Roman Mejtes
Код и результаты выполнения не совпадают :D


Да, я просто там добавил

....WriteLine("Exception {0}", e.GetType());


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