Как работают статические конструкторы для универсальных типов? - PullRequest
6 голосов
/ 12 апреля 2011
public abstract class EventSystemBase<T, K> : IAutoEvent
    where T : Event
    where K : IAutoEvent, new()
{
    public static T Instance { get { return EventSystem.Events.OfType<T>().FirstOrDefault(); } }
    public static IAutoEvent AutoEventInstance { get { return new K(); } }

    static EventSystemBase()
    {
        EventBot.Register(new EventBotEntry(Instance.Name, AutoEventInstance));
    }

    [...]
}

Я не очень понимаю, как это компилируется.

  • Когда запускается статический конструктор?
  • Почему я могу использовать универсальные типы в статических членах?
  • Как узнать, какие типы применять?

Ответы [ 4 ]

7 голосов
/ 12 апреля 2011
  • Статический конструктор - , в первый момент он необходим . Точное время немного сложнее, потому что если флаги как beforefieldinit в двоичном файле; вам, вероятно, не нужно слишком беспокоиться о деталях, за исключением того, что он запускается при обращении к первому члену класса, прежде чем он потребуется.

  • Ну, а почему бы и нет? :) Каждый тип формы EventSystemBase<T, K> является его собственным отдельным классом и не имеет никакого отношения к другим универсальным экземплярам класса, поэтому конструктор должен запускаться для каждого из них. Они все отличаются от времени исполнения во всех * отношениях.

  • Статический конструктор работает для типа «приготовлено», а не - для «необработанного» типа (т. Е. Он работает для версии с заменой универсальных типов), поэтому Здесь нет реальной проблемы.

* На самом деле, среда выполнения избегает создания дубликатов экземпляров обобщенных типов. Но это не имеет значения здесь, для программиста или для программы.

2 голосов
/ 12 апреля 2011

Статический конструктор не для открытого универсального типа.Он будет работать только тогда, когда вы указали параметры типа, например, EventSystemBase<MyEvent, MyAutoEvent>, который на самом деле отличается от класса, например, EventSystemBase<AnotherEvent, MyAutoEvent> с его собственным статическим конструктором.В в каждом случае статический конструктор запускается до создания первого экземпляра этого отдельного класса или ссылки на любой из его статических членов.

1 голос
/ 12 апреля 2011

Если он применяет то же самое из моих знаний о С ++ в тот же день ...

Обобщения генерируются во время компиляции , и они преобразуются во многие отдельные и отличные классы.Для каждого из этих классов статический конструктор запускается до того, как любой код ссылается на статический класс.CLR знает, на какие типы ссылаться, поскольку каждый из классов уникален .

EventSystemBase <<em> string , byte > не имеет абсолютно никакого отношения кEventSystemBase <<em> string , int >.Вы как будто написали два совершенно разных класса в своем исходном коде.

class Program
{
    public static void Main()
    {
        var myInt = new MyGeneric<int>();
        myInt.InstanceMethod();
        MyGeneric<int>.StaticMethod();

        MyGeneric<long>.StaticMethod();
        var myLong = new MyGeneric<long>();
        myLong.InstanceMethod();

        Console.ReadLine();
    }
}

public class MyGeneric<T>
{
    static MyGeneric()
    {
        Console.WriteLine("Static constructor: {0}", typeof(T).Name);
    }

    public static void StaticMethod()
    {
        Console.WriteLine("Static method: {0}", typeof(T).Name);
    }

    public void InstanceMethod()
    {
        Console.WriteLine("Instance method: {0}", typeof(T).Name);
    }
}
0 голосов
/ 12 апреля 2011
  1. Статический конструктор для универсального объекта вызывается каждый раз, когда вы вызываете другой универсальный класс .

2-3. с 1 должно быть ясно, оно высвобождается в общий T, K

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...