Почему статический конструктор родительского класса не вызван при вызове метода на вложенный класс?

Учитывая следующий код, почему статический конструктор не имеет "Внешних", названных после первой строки "Основных"?

namespace StaticTester
{
    class Program
    {
        static void Main( string[] args )
        {
            Outer.Inner.Go();
            Console.WriteLine();

            Outer.Go();

            Console.ReadLine();
        }
    }

    public static partial class Outer
    {
        static Outer()
        {
            Console.Write( "In Outer's static constructor\n" );
        }

        public static void Go()
        {
            Console.Write( "Outer Go\n" );
        }

        public static class Inner
        {
            static Inner()
            {
                Console.Write( "In Inner's static constructor\n" );
            }

            public static void Go()
            {
                Console.Write( "Inner Go\n" );
            }
        }
    }
}
5
задан Ryan Ische 13 April 2010 в 12:59
поделиться

4 ответа

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

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

Вы можете прочитать больше о семантике отложенной инициализации C # в блоге Джона Скита - это неплохо. Вы также можете почитать его книгу - C # In Depth , она также охватывает эти темы ... подробно.

5
ответ дан 18 December 2019 в 13:12
поделиться

Статический инициализатор выполняется только тогда, когда содержащий класс используется в первый раз.

Вызывая Outer.Inner , вы вообще не используете Outer , поскольку Outer.Inner - это другой тип, чем Outer ]. Таким образом, статический инициализатор в Outer не будет работать.

0
ответ дан 18 December 2019 в 13:12
поделиться

На ваш вопрос отвечает раздел 10.12 спецификации, который гласит:

Выполнение статического конструктора запускается первым из следующих событий, которые происходят в { {1}} домен приложения:

• Создается экземпляр типа класса.

• Ссылка на любой из статических членов типа класса .

Так как вы не сделали ни одного из этих двух действий, ctor не выполняется.

6
ответ дан 18 December 2019 в 13:12
поделиться

Outer.Inner просто ссылается на тип, на самом деле он ничего не вызывает у "Outer".

3
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

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