2011-03-07 91 views
3

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

像这样

[NoStaticInstances] 
public class MyClass { 
} 

使

public static MyClass _myClass; 

会导致错误?

+1

什么是静态实例? – smartcaveman 2011-03-07 16:29:38

+0

对不起,我想在考虑后问了一个愚蠢的问题:)我想这种功能真的没有办法。 – 2011-03-07 16:35:45

回答

3

你可以做的是:

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

静态字段将“常”被静态构造函数来创建。上面的代码所做的是查看调用方法以查看它是否是静态构造函数,如果是这种情况,则抛出异常。

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

+0

很酷,这是我想要的,谢谢你。无论我的情况是否可以解决,我只是想帮助防止出现错误,所以这是理想的。 – 2011-03-07 16:42:47

+0

@Paul:请注意,这很慢,所以你可能要考虑只在调试模式下运行。查看我的更新。 – Steven 2011-03-07 18:15:51

9

有没有这样的事情作为“静态实例” - 只有一个静态变量,它被赋值。并且没有办法阻止声明特定类型的静态变量,除非您将类型本身设为静态,这将防止创建任何实例,并且会声明任何变量。

想象一下,如果你想要的功能确实存在 ...你会如何期待下面的代码行为?

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

总之,我不认为你将能够阻止抱着你的类的实例的引用静态变量。出于兴趣,你为什么想要

+0

它只是为了防止在使用登录助手中犯的错误。如果它在静态Web应用程序中存储,则会出现问题。我可能需要更改登录帮助程序,使其可以变为静态。 – 2011-03-07 16:24:46

+1

我知道你试图阻止其他开发者犯错误,但要停止?开发人员可以做很多事情都是错误的。你最好写出很好的(xml)文档来清楚地解释这一点。编写FxCop规则也可能是一个不错的选择,但这通常相当耗时。 – Steven 2011-03-07 16:32:41

0

不,不可以在C#中指定对象引用的范围或生命周期。

2

这样的限制是没有意义的。

如果你写

static object something = new YourClass(); 
+0

我认为它不存在。如果确实如此,那么上面的代码理想情况下会导致编译错误,就像您尝试创建抽象类的实例一样。 – 2011-03-07 16:26:37

+0

@Paul:如果您通过临时本地进行分配,该怎么办? – SLaks 2011-03-07 16:34:52

1

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

相关问题