C# 防止类具有在C中创建的静态实例#

C# 防止类具有在C中创建的静态实例#,c#,class,static,C#,Class,Static,有没有办法防止类在C#中创建静态实例。我认为没有,但可能有用。例如,只是一些属性来阻止它 像这样的 [NoStaticInstances] public class MyClass { } 所以 public static MyClass _myClass; 是否会导致错误?没有“静态实例”这样的东西-只有一个静态变量,它被赋值。没有办法阻止声明特定类型的静态变量,除非将类型本身设置为静态,这将阻止创建任何实例和声明该类型的任何变量 想象一下,如果你想要的功能确实存在。。。您希望以下代码的行

有没有办法防止类在C#中创建静态实例。我认为没有,但可能有用。例如,只是一些属性来阻止它

像这样的

[NoStaticInstances]
public class MyClass {
}
所以

public static MyClass _myClass;

是否会导致错误?

没有“静态实例”这样的东西-只有一个静态变量,它被赋值。没有办法阻止声明特定类型的静态变量,除非将类型本身设置为静态,这将阻止创建任何实例和声明该类型的任何变量

想象一下,如果你想要的功能确实存在。。。您希望以下代码的行为如何

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;
    }
}

简而言之,我认为您无法阻止静态变量持有对类实例的引用。出于兴趣,您为什么要这样做?

不,在C#中无法指定对象引用的范围或生存期

这样的限制是没有意义的

如果你写信呢

static object something = new YourClass();

不太可能,没有支持此功能的语言或编译器功能。

您可以执行以下操作:

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
    }
}
静态字段“通常”由静态构造函数创建。上面的代码所做的是查看调用方法,看看它是否是静态构造函数,如果是,则抛出异常


但是请注意,此检查非常脆弱,聪明的用户可以通过将此方法的创建重构到另一个方法来轻松解决此问题。换句话说,我同意其他人的看法,没有好的方法可以做到这一点。

这只是为了防止在使用登录助手时出错。如果它以静态形式存储在web应用程序中,则存在问题。我可能需要更改登录帮助程序,使其成为静态的。我知道您试图防止其他开发人员犯错误,但是否要停止?开发人员可以做很多错事。最好编写良好的(xml)文档来清楚地解释这一点。编写FxCop规则也可能是一个不错的选择,但这通常相当耗时。我认为它并不存在。如果是这样的话,那么上面的代码在理想情况下会导致编译错误,就像您试图创建抽象类的实例一样。@Paul:如果您通过临时本地分配它会怎么样?对不起,我想我在考虑之后问了一个愚蠢的问题:)我想这样的功能真的不可能工作。酷,这就是我想要的谢谢你。在我的例子中,如果它可以被处理,我只是想帮助防止错误,所以这是理想的。”保罗:请注意这很慢,所以你可能只想在调试模式下运行这个。查看我的更新。