Comments 41
Может Вам в Q&A?
В Q&A нет голосования, а я думаю, что многим будет интересен не так факт разъяснения правильного ответа (что конечно тоже не маловажно), но и понимание какая часть пользователей знает этот правильный ответ. Именно с этой целью и создавался этот пост.
Правильные ответы в студию!
А что делать, если нет правильного ответа?
В каком вопросе?
В первом.
В первом вопросе есть правильный ответ.
Вам Липперта процитировать?
(нет, первый ответ не правильный)
(нет, первый ответ не правильный)
Почему первый вариант ответа неверный достаточно очевидно. Расскажите, почему третий вариант («Строгий порядок вызова не определен») неверный, с вашей точки зрения.
Потому что под данный ответ замечательно ложится сценарий, когда конструктор будет вызван после обращения к каким-либо членам типа.
Действительно, тоже достаточно очевидно. Спасибо. :)
Если говорить о явно определенном статическом конструкторе, возможен сценарий, когда конструктор не будет вызван даже после обращения к членам типа.
msdn.microsoft.com/en-us/library/ms182346
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
Потому что есть граничные условия (а порядок вызова у последовательности из одного члена строго определен всегда).
Да, действительно, вчитался внимательнее в варианты — правильного ответа там нет.
Также, 11 вопрос. В настройках компилятора есть Treat All Warnings As Errors, в таком случае будет ошибка.
Он, видимо, просто некорректно сформулирован. Скорее всего, речь шла об явно объявленном статическом конструкторе.
Все равно нет правильного ответа.
Ок, тогда, видимо, о необъявленном явно. Тогда есть правильный ответ =)
Сам ошибся — сам исправлю. Нет никаких явно- или неявно- объявленных статических конструкторов — либо статический конструктор есть, либо его нет.
Вообще-то есть )
msdn.microsoft.com/hi-in/magazine/cc163857#S1
msdn.microsoft.com/hi-in/magazine/cc163857#S1
Вообще-то… спорно. Я больше доверяю словам Липперта (недавняя статья):
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.
Не хватает ещё одного опросика в конце (в начале) с двумя вариантами:
— Я .NET разработчик
— Я зашел просто хаотически потыкать опросы
— Я .NET разработчик
— Я зашел просто хаотически потыкать опросы
11 вопрос неправильный. Есть перегрузка конструктора аттрибута [Obsolete], которая говорит компилятору, что нужно выдавать ошибку, а не предупреждение.
И еще не понятно, что значит «влияет»
И еще не понятно, что значит «влияет»
В четвертом вопросе #elseif в C# не существует, но есть #elif. #typedef вообщем тоже отсутствует, хотя можно создавать алиасы через using.
Напишите потом, пожалуйста, отчетную статью с правильными ответами.
Если голоса хабражителей меня не обманывают, то ответил вроде бы правильно на всё, только директиву #elseif не вспомнил.
На 12 вопросе немного подвис, но вроде правильно.
На 12 вопросе немного подвис, но вроде правильно.
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 неверно и никакого обращения к классу реально не происходило.
Статические поля инициализируются ДО любого использования класса. Статический конструктор вызывается ДО использования класса и ПОСЛЕ инициализации статических полей.
Все остальное сильно зависит от реализации и условий. Обычно статический констурктор вызывается после компиляции класса, класс компилирируется тогда, когда до него «дотронутся». Дотронутся до него, это не только вызов метода, но и компиляция метода, где этот класс используется.
Все остальное сильно зависит от реализации и условий. Обычно статический констурктор вызывается после компиляции класса, класс компилирируется тогда, когда до него «дотронутся». Дотронутся до него, это не только вызов метода, но и компиляция метода, где этот класс используется.
Only those users with full accounts are able to leave comments. Log in, please.
Несколько вопросов по .NET и C#