【问题标题】:Prevent a Class having static instances of it created in C#防止在 C# 中创建具有静态实例的类
【发布时间】:2011-03-07 16:16:15
【问题描述】:

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

类似的东西

[NoStaticInstances]
public class MyClass {
}

这样

public static MyClass _myClass;

会导致错误吗?

【问题讨论】:

  • 对不起,我想我想了想我问了一个愚蠢的问题 :) 我想这样的功能真的不可能工作。

标签: c# class static


【解决方案1】:

没有“静态实例”之类的东西 - 只有一个静态变量,它被分配了一个值。并且没有办法阻止声明特定类型的静态变量,除非您将类型本身设为静态,这将阻止创建 any 实例和该类型的 any 变量从被宣布。

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

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

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

【讨论】:

  • 这只是为了防止在使用登录助手时出错。如果它以静态形式存储在 Web 应用程序中,则存在问题。我可能需要更改登录助手,以便将其设为静态。
  • 我了解到您试图阻止其他开发人员犯错,但被阻止了?开发人员可能会做错很多事情。您最好编写好的(xml)文档来清楚地解释这一点。编写 FxCop 规则也是一个不错的选择,但这通常非常耗时。
【解决方案2】:

你可以做的是:

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

静态字段将“通常”由静态构造函数创建。上面代码所做的就是查看调用方法,看它是否是静态构造函数,如果是,则抛出异常。

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

【讨论】:

  • 很酷,这是我想要的,谢谢。在我的情况下是否可以解决它并不重要,我只是想帮助防止犯错,所以这是理想的。
  • @Paul:请注意这非常慢,因此您可能只想考虑在调试模式下运行它。查看我的更新。
【解决方案3】:

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

如果你写了会怎样

static object something = new YourClass();

【讨论】:

  • 我认为它不存在。如果是这样,那么上面的代码理想情况下会导致编译错误,就像您尝试创建抽象类的实例一样。
  • @Paul:如果你通过一个临时本地来分配呢?
【解决方案4】:

并非如此,没有支持此功能的语言或编译器功能。

【讨论】:

    【解决方案5】:

    不,没有办法在 C# 中规定对象引用的范围或生命周期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 2020-09-05
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多