Запретить классу, имеющему статические экземпляры, созданные в C # - PullRequest
3 голосов
/ 07 марта 2011

Есть ли способ предотвратить создание статических экземпляров класса в C #. Я не думаю, что есть, но это может быть полезно. Например, какой-то атрибут, чтобы предотвратить это.

как то так

[NoStaticInstances]
public class MyClass {
}

так что

public static MyClass _myClass;

может вызвать ошибку?

Ответы [ 5 ]

9 голосов
/ 07 марта 2011

Нет такого понятия, как «статический экземпляр» - есть только статическая переменная, которой присваивается значение.И нет никакого способа предотвратить объявление статических переменных определенного типа, если вы не сделаете сам тип статичным, что предотвратит создание любых экземпляров и любых переменных этого типаобъявляется.

Представьте, если бы ваша нужная функция существовала существовала ... как бы вы ожидали, что следующий код будет вести себя?

class Test
{
    static object foo;

    static void Main()
    {
        MyClass bar = new MyClass();
        foo = bar;
    }
}

Какая строка этого может вызватьошибка, если есть?Если это присваивание, представьте вместо этого:

class Test
{
    static object foo;

    static void Main()
    {
        MyClass bar = new MyClass();
        object tmp = bar;
        foo = tmp;
    }
}

Короче говоря, я не думаю, что вы сможете предотвратить статические переменные, содержащие ссылки на экземпляры вашего класса.Из интереса, почему вы хотите к?

3 голосов
/ 07 марта 2011

Что вы можете сделать, это:

public class MyClass
{
    public MyClass()
    {
#if DEBUG // Only run in debug mode, because of performance.
        StackTrace trace = new StackTrace();

        var callingMethod = trace.GetFrames()[1].GetMethod();

        if (callingMethod.IsStatic && 
            callingMethod.Name == ".cctor")
        {
            throw new InvalidOperationException(
                "You naughty boy!");
        }
#endif
    }
}

Статические поля будут «нормально» создаваться статическими конструкторами. Код, приведенный выше, просматривает вызывающий метод, чтобы определить, является ли он статическим конструктором, и, если это так, выдает исключение.

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

2 голосов
/ 07 марта 2011

Такое ограничение не имеет смысла.

Что если вы напишите

static object something = new YourClass();
1 голос
/ 07 марта 2011

Не совсем, нет языка или функции компилятора, которая бы поддерживала это.

0 голосов
/ 07 марта 2011

Нет, в C # нет способа определять область действия или время жизни ссылок на объекты

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