Учитывая следующий код, почему статический конструктор не имеет "Внешних", названных после первой строки "Основных"?
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" );
}
}
}
}
В случае вложенных классов, если вложенный класс никогда не ссылается на статические члены своей внешней области видимости, компилятор (и среда CLR) не обязаны вызвать статический конструктор этого внешнего класса.
Если вы хотите принудительно запустить статический конструктор, просто добавьте код к внутреннему типу, который выполняет чтение поля или свойства внешнего типа.
Вы можете прочитать больше о семантике отложенной инициализации C # в блоге Джона Скита - это неплохо. Вы также можете почитать его книгу - C # In Depth , она также охватывает эти темы ... подробно.
Статический инициализатор выполняется только тогда, когда содержащий класс используется в первый раз.
Вызывая Outer.Inner
, вы вообще не используете Outer
, поскольку Outer.Inner
- это другой тип, чем Outer
]. Таким образом, статический инициализатор в Outer
не будет работать.
На ваш вопрос отвечает раздел 10.12 спецификации, который гласит:
Выполнение статического конструктора запускается первым из следующих событий, которые происходят в { {1}} домен приложения:
• Создается экземпляр типа класса.
• Ссылка на любой из статических членов типа класса .
Так как вы не сделали ни одного из этих двух действий, ctor не выполняется.
Outer.Inner просто ссылается на тип, на самом деле он ничего не вызывает у "Outer".