Время жизни статического поля в базовом классе - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть простой базовый класс с одним статическим полем.У меня есть многочисленные классы, которые происходят от этого базового класса.Когда я создаю производный класс, он вызывает статический ctor базовых классов, который инициализирует статическое поле (работает как положено).Проблема в том, что когда я создаю другой производный класс, который наследуется от той же базы, статическое поле в базе все еще равно нулю, почему ????Это было инициализировано первым классом, который я создал.

Разве статические поля в базовых классах не должны иметь глобального распределения и быть видимыми (то есть общими) для всех производных классов?

Моя модель:

class Base<T>
{

 protected static object s_field = null;

 static Base { s_field = new object(); }
}

class Derived1<T> : Base<T>
{

}

class Derived2<T> : Base<T>
{

}

// ... later in the program

Derived1<int> instance1 = new Derived1<int>(); // initializes static field (s_field in base class) for all derived types

Derived2<double> instance2 = new Derived2<double>(); // the static field is null

(могуувидеть это через отладчик, но разве он не был инициализирован предыдущей строкой ??)

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Поскольку вы изменили свой код, я считаю, что вам нужно понять, как работают дженерики в .NET.

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

Вы создаете еще один экземпляр открытого типа double для того же базового класса через Derived , тогда вы увидите концепцию, о которой я говорю.

Вот пример кода, чтобы продемонстрировать более наглядно:

public class Base<T>
    {
        public static string str = null;

        static Base()
        {
            str = "hello";

            Console.WriteLine("Ctor cald");
        }
    }

    public class Derived1<T> : Base<T>{}
    public class Derived2<T> : Base<T> { }

    public partial class Program
    {
         public static void Main()
        {
            Derived1<int> derv = new Derived1<int>();
            Derived2<double> derv2 = new Derived2<double>();
            Derived2<double> derv3 = new Derived2<double>();


            Console.ReadKey();
        }      
    }  

Здесь вы увидите только 2 вызова статического Ctor.

1 голос
/ 22 декабря 2011

Я понял свою ошибку! Вау, базовый класс на самом деле является шаблоном класса: Base<T>. Когда я создаю объект базы следующим образом new Derived<int>(), new Derived<double>(), new Derived<object>(), это совершенно разные типы, и поэтому правила статического поля различны, я понимаю, что статическое поле будет выделено для семейства типа T , Я исправил приведенный выше пример, чтобы отразить это (в первоначальном посте).

0 голосов
/ 22 декабря 2011

Весь вопрос меняется, когда вы помещаете дженерики в картинку.Ваше понимание наследования статических членов работает, как и ожидалось, без универсальных элементов, и когда универсальные элементы находятся на местах, концепция остается действительной, за исключением того, что универсальные типы создают различные типы во время выполнения.Base<int> и Derived1<int> совместно используют один и тот же статический элемент, где Derived1<decimal> будет отличаться от Base<int> во время выполнения, который не разделяет статический член с.

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