[.NET 4] выкидывание переменных - баг или фича
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.06.10 13:29
Оценка:
Всем привет.
Есть логика, построенная на сайдэффектах от инициализации переменных. С переходом на .NET 4 она перестала отрабатывать в релизе.

    class Base
    {
        public Base()
        {
            Console.WriteLine("Base constructed.");
        }
        public static string BaseStaticString;

        public static string SideEffect(string str)
        {
            return BaseStaticString = str;
        }
    }

    class Derived : Base
    {
        public static string DerivedStaticString = SideEffect("A"); // Выкидывается в релизе
    }

    class Program
    {
        static void Main(string[] args)
        {
            Activator.CreateInstance(typeof (Derived));
            Console.WriteLine(Base.BaseStaticString);
            Console.WriteLine("done.");
            Console.ReadKey();
        }
    }


Где можно почитать о выкидывании инициализаторов переменных со включенной оптимизацией в .NET 4? Случилось так, что выкинуты инициализаторы используемых переменных, но это у меня пока не получается смоделировать в небольшом примере.

В качестве воркэраунда помог перенос инициализаторов в статический конструктор.
Re: [.NET 4] выкидывание переменных - баг или фича
От: nikov США http://www.linkedin.com/in/nikov
Дата: 25.06.10 13:39
Оценка: 8 (1) +1
Здравствуйте, samius, Вы писали:

S>Где можно почитать о выкидывании инициализаторов переменных со включенной оптимизацией в .NET 4?


Это вполне допустимо по спецификации:

10.5.5.1 Static field initialization

If a static constructor (§10.12) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.


То есть, если статические поля не используются и статический конструктор отсутствует, то инициализаторы могут и не вызваться. А могут и вызваться.
Re: [.NET 4] выкидывание переменных - баг или фича
От: nikov США http://www.linkedin.com/in/nikov
Дата: 25.06.10 13:43
Оценка: +1
Здравствуйте, samius, Вы писали:

S>В качестве воркэраунда помог перенос инициализаторов в статический конструктор.


Не обязательно переносить туда инициализаторы. Достаточно добавить пустой статический конструктор.
Re[2]: [.NET 4] выкидывание переменных - баг или фича
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.06.10 13:46
Оценка:
Здравствуйте, nikov, Вы писали:

N>То есть, если статические поля не используются и статический конструктор отсутствует, то инициализаторы могут и не вызваться. А могут и вызваться.


Проблема возникла с полями, которые используются! Но не напрямую. Они используются в перекрытом виртуальном методе, который вызывается у дженерик параметра через констрейнт.
Re[3]: [.NET 4] выкидывание переменных - баг или фича
От: nikov США http://www.linkedin.com/in/nikov
Дата: 25.06.10 13:47
Оценка:
Здравствуйте, samius, Вы писали:

S>Проблема возникла с полями, которые используются! Но не напрямую. Они используются в перекрытом виртуальном методе, который вызывается у дженерик параметра через констрейнт.


Можно код посмотреть?
Re[4]: [.NET 4] выкидывание переменных - баг или фича
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.06.10 13:59
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, samius, Вы писали:


S>>Проблема возникла с полями, которые используются! Но не напрямую. Они используются в перекрытом виртуальном методе, который вызывается у дженерик параметра через констрейнт.


N>Можно код посмотреть?


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

С точки зрения спецификации все верно. Эти поля используются впринципе. Но уже после того, как идет работа с sideeffect-ом от их инициализации через базовый класс.

Я рассчитывал что все статическое будет инициализироваться перед созданием экземпляра класса. Но все оказалось сложнее. Спецификация все объяснила. Спасибо!
Re: [.NET 4] выкидывание переменных - баг или фича
От: notacat  
Дата: 25.06.10 17:17
Оценка: :)
как раз на такую же ерунду на этой неделе наткнулись в 4 сильверлайте. Только у нас все проще. Никакого наследования, все в пределах одного класса. Статическое поле инициализировалось в методе при первом обращении. Все это соптимизировалось. Пришлось в статический конструктор инициализацию выносить.
Больше всего порадовал текст исключения, которое в рантайме получается: "Common Language Runtime detected an invalid program."
Re[2]: [.NET 4] выкидывание переменных - баг или фича
От: nikov США http://www.linkedin.com/in/nikov
Дата: 25.06.10 18:06
Оценка:
Здравствуйте, notacat, Вы писали:

N>Больше всего порадовал текст исключения, которое в рантайме получается: "Common Language Runtime detected an invalid program."


Это откровенный баг. А есть пример для воспроизведения? На ms connect отправляли?
Re[3]: [.NET 4] выкидывание переменных - баг или фича
От: notacat  
Дата: 25.06.10 19:14
Оценка:
N>Это откровенный баг. А есть пример для воспроизведения? На ms connect отправляли?
нет, не отправляли. На простых примерах не могу воспроизвести, а рабочий код не могу показывать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.