Использование статического конструктора (головоломка стрельбы по тарелочкам Jon)

Любое время, с которым Вы делаете вычисления, удваивается, это может произойти. Этот код дал бы Вам 877.85:

двойной ответ = Math.round (dCommission * 100000) / 100000.0;

18
задан Johannes Pille 2 May 2012 в 13:17
поделиться

5 ответов

Теперь попробуйте в режиме выпуска, вне отладчика ;-p

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

25
ответ дан 30 November 2019 в 07:33
поделиться

Я думаю, что foo bar будет напечатан. Конструктор статического типа будет сначала выполнен в Foo, затем будет вызываться метод Init для класса Bar. Я не знаю, может ли поведение измениться или нет. Это интересно.

0
ответ дан 30 November 2019 в 07:33
поделиться

Просто взглянув на него, я был бы удивлен, если бы он отобразил что-нибудь еще, кроме «FooBar».

По той простой причине, что вы сначала обращаетесь к Foo, поэтому его статический конструктор будет запущен. За ним следует инициализатор статического поля при создании экземпляра Bar.

Рад быть исправленным.

0
ответ дан 30 November 2019 в 07:33
поделиться

Это обсуждается на странице ответов Джона . Я не специалист по C #, но похоже, что у системы есть ровно один выбор, когда вызывать статический код foo (и, следовательно, писать «Foo»), но у нее есть практически неограниченная свобода выбора, когда инициализировать Bar.i (который будет писать «Бар»), поэтому это может произойти либо при загрузке класса, либо при его первом использовании, либо вообще не происходить.

6
ответ дан 30 November 2019 в 07:33
поделиться

Он печатает Foo, Bar в режиме отладки и Bar, Foo в режиме Release. Итак, что происходит, так это то, что код выпуска оптимизирован, и в результате оптимизации сначала вызывается Bar - но нет гарантии, что так будет всегда.

4
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: