Как стать автором
Обновить

Комментарии 41

В Q&A нет голосования, а я думаю, что многим будет интересен не так факт разъяснения правильного ответа (что конечно тоже не маловажно), но и понимание какая часть пользователей знает этот правильный ответ. Именно с этой целью и создавался этот пост.
К тому же отличие данного топика от Q&A в том, что я готов подробно ответить на любой из вышепредставленных вопросов.
А что делать, если нет правильного ответа?
В каком вопросе?
В первом.
В первом вопросе есть правильный ответ.
Вам Липперта процитировать?

(нет, первый ответ не правильный)
Почему первый вариант ответа неверный достаточно очевидно. Расскажите, почему третий вариант («Строгий порядок вызова не определен») неверный, с вашей точки зрения.
Потому что под данный ответ замечательно ложится сценарий, когда конструктор будет вызван после обращения к каким-либо членам типа.
Действительно, тоже достаточно очевидно. Спасибо. :)
Если говорить о явно определенном статическом конструкторе, возможен сценарий, когда конструктор не будет вызван даже после обращения к членам типа.

An explicit static constructor is only guaranteed to run before an instance constructor or static member of the type is called. Therefore, if the type is created without calling an instance constructor, the static constructor is not guaranteed to run.

msdn.microsoft.com/en-us/library/ms182346
Эта цитата говорит ровно то что я сказал. Гарантируется до обращения к какому-нибудь члену (ну или при создании экземпляра). Не гарантируется при создании типа без вызова instance constructor, а это уже другая история.
Потому что есть граничные условия (а порядок вызова у последовательности из одного члена строго определен всегда).
Да, действительно, вчитался внимательнее в варианты — правильного ответа там нет.
Также, 11 вопрос. В настройках компилятора есть Treat All Warnings As Errors, в таком случае будет ошибка.
В 11 вопросе верный ответ — 4й «Нет нужного варианта ответа». Т.к. в зависимости от переданного в конструктор к ObsoleteAttribute значения — будет или warning или error. + еще есть настройка компилятора, как вы упомянули.
Не знал про аргумент, спасибо.
Он, видимо, просто некорректно сформулирован. Скорее всего, речь шла об явно объявленном статическом конструкторе.
Все равно нет правильного ответа.
Ок, тогда, видимо, о необъявленном явно. Тогда есть правильный ответ =)
Сам ошибся — сам исправлю. Нет никаких явно- или неявно- объявленных статических конструкторов — либо статический конструктор есть, либо его нет.
Вообще-то… спорно. Я больше доверяю словам Липперта (недавняя статья):

But suppose there is no user-supplied static constructor. Then what happens?

The C# compiler is not bound by the rules of static constructors in this case, and in fact, does not treat your program as though there was an empty static constructor that has static field initializers in it.
это да, Boxing и Unboxing и implicit конвертацию надо знать (=
Не хватает ещё одного опросика в конце (в начале) с двумя вариантами:
— Я .NET разработчик
— Я зашел просто хаотически потыкать опросы
Я честно надеюсь, что те, кто «зашел просто хаотически потыкать опросы» дружно нажали «Воздержаться»…
11 вопрос неправильный. Есть перегрузка конструктора аттрибута [Obsolete], которая говорит компилятору, что нужно выдавать ошибку, а не предупреждение.

И еще не понятно, что значит «влияет»
Комментарии пиши @ комментарии не читай
В четвертом вопросе #elseif в C# не существует, но есть #elif. #typedef вообщем тоже отсутствует, хотя можно создавать алиасы через using.
Напишите потом, пожалуйста, отчетную статью с правильными ответами.
Думаю сегодня-завтра вечером подведу итог с правильными ответами и оценкой сложности заданий (=
Если голоса хабражителей меня не обманывают, то ответил вроде бы правильно на всё, только директиву #elseif не вспомнил.
На 12 вопросе немного подвис, но вроде правильно.
Вопрос №3 и вопрос №9 пока вызвал у хабражителей наибольшие затруднения, большинство проголосовало за неправильные ответы.
Это хорошо — значит, на них я ответил правильно.
1. Когда вызываются статические конструкторы классов в C#?
Один раз при первом создании экземпляра класса или при первом обращении к статическим членам класса
После каждого обращения к статическим полям, методам и свойствам
Строгий порядок вызова не определен
Статических конструкторов в C# нет

Мне кажется, тут нет правильного варианта. Правильный ответ — до вызова метода, который первый вызовет статический метод/создаст объект, а не в момент, когда это произойдет. Пример, при выполнении кода:
class Singleton
{
    public static string S = Echo("Field initializer");
 
    public static string Echo(string s)
    {
        Console.WriteLine(s);
        return s;
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Starting Main...");
        if (args.Length == 1)
        {
            Console.WriteLine(Singleton.S);
        }
        Console.ReadLine();
    }
}

вывод будет таким:
Field initializer
Starting Main...

То есть поле будет проинициализировано, даже если условие в if неверно и никакого обращения к классу реально не происходило.
Статические поля инициализируются ДО любого использования класса. Статический конструктор вызывается ДО использования класса и ПОСЛЕ инициализации статических полей.
Все остальное сильно зависит от реализации и условий. Обычно статический констурктор вызывается после компиляции класса, класс компилирируется тогда, когда до него «дотронутся». Дотронутся до него, это не только вызов метода, но и компиляция метода, где этот класс используется.
Статический конструктор вызывается ДО использования класса и ПОСЛЕ инициализации статических полей.

Напишите класс со статическим полем, но без статического конструктора, и посмотрите рефлектором, во что превратился код.
Сори, я наверно неправильно выразился.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории