Являются ли статические члены в базовых классах общими для своих производных классов - PullRequest
1 голос
/ 18 апреля 2011

Вопрос касается .Net конкретно.

Предположим, что базовый класс A имеет 2 производных класса B и C. Кроме того, предположим, что базовый класс A имеет статическую переменную с именем 's'.Являются ли значения этой статической переменной общими для 'B' и 'C', или каждый получает свою собственную копию статической переменной.

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

Я на самом деле сталкиваюсь с совершенно уникальной ситуацией.В моем случае все A, B и C не являются общими.А А имеет статический член.Но значение для этого члена различно для B и C, что, по моему мнению, не должно было иметь место (если мое приведенное выше утверждение для статических переменных неверно).

EDIT:

Ну, мое приложение является приложением ASP.NET.Я продолжаю отлаживать это, но согласно моей текущей оценке, это происходит следующим образом:

  1. Я ставлю точку останова, где переменная изменяется, и ее значение обновляется при первом обращении к точке останова.
  2. При следующем достижении точки останова переменная возвращается к своему старому значению и снова инициализируется.Это закрытая переменная, которая изменяется только в одном месте.

Я думаю, что, возможно, домен приложения был перезаписан или каким-то другим образом класс выгружен из памяти.Я все еще занимаюсь расследованием, но спасибо всем за ответы.

Ответы [ 2 ]

4 голосов
/ 18 апреля 2011

Не могли бы вы показать код?

public class A
{
    private static string test;
    public string Test { get { return test; } set { test = value; } }

    public override string ToString()
    {
        return Test;
    }
}

public class B : A
{
    public override string ToString()
    {
        return base.ToString();
    }
}

public class C:A
{
    public override string ToString()
    {
        return base.ToString();
    }
}

Код тестовой консоли

    private static void Test()
    {
        Console.Clear();

        A a = new A();
        B b = new B();
        C c = new C();
        a.Test = "Test A";
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
        b.Test = "Test B";
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
        c.Test = "Test C";
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);

        Console.ReadKey();
    }

Результат теста консоли

Испытание A

Испытание A

Испытание A

Испытание B

Тест Б

Тест B

Тест С

Тест С

Тест С

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

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

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