【问题标题】:Referencing an instantiated object in a static class (c#)引用静态类中的实例化对象(c#)
【发布时间】:2010-01-06 17:41:27
【问题描述】:

我想知道是否可以让一个静态类实例化另一个类,以便在全局范围内持有对它的引用。我有一个数据存储,它由一个内存对象组成,并且想从不同的位置访问它。数据需要将更改持久化到应用程序中,因此需要在窗口或 UI 范围之外进行实例化。

我希望使用静态类来执行此操作是正确的方法。这就是单例吗?我正在寻找的可能吗?

【问题讨论】:

  • 谢谢大家,我已经考虑了你们的所有回答,我觉得我现在可以更好地解决这个问题了!
  • 我认为这是一个很好的问题,因为它会引发一些很好的讨论和链接。一个月前,我会认为单身人士是王牌。我从没想过我会在 40 岁成熟的时候学到这么多(+/-):)
  • 最后我发现一个很好的方法是在实例中拥有一个私有静态类。这意味着我基本上有一个单例,但只对需要它的类可用。这就是我用后备存储可视化类的方式。

标签: c# static singleton


【解决方案1】:

通常的处理方式是使用Singleton Pattern。这基本上创建了一个非静态类的单个实例,可以静态访问(通常使用ClassName.Instance 属性)。

这是creating a singleton in C# 上的一个很棒的页面。

【讨论】:

  • 我在工作,刚走,我回家看看你的链接,为输入干杯!
【解决方案2】:

这是一个简单的例子......你可以通过使用 Config.Instance.Value

来获取该属性
public class Config
{
    private Config() 
    {
        this.Value = "foobarr";
    }
    private static object _syncLock = new object();
    private static Config _instance;
    public static Config Instance
    {
        get
        {
            lock (_syncLock)
            {
                if (_instance == null)
                    _instance = new Config();
                return _instance;
            }
        }
    }

    public string Value { get; private set; }
}

【讨论】:

  • 是的,您可能还想查看锁和互斥锁。
  • 这实际上也不会编译。此外,一般来说,制作未密封的静态实例是一个非常糟糕的主意(即:受保护的集应该是私有集)。我发布的链接有一个更好、更健壮(线程安全)的单例实现。
  • 可以将实例作为与静态调用者相同类型的其他东西吗?假设每次获取的实例都是同一个实例是否正确?编辑:抱歉刚刚看到你的评论里德,很快就会检查那个链接!
  • @DeanMc:可以(尽管不寻常)让实例与调用者的类型不同,但这通常是包含单例类型的子类。在这种情况下,您可能需要一个工厂方法来构造实例,并且必须自己处理任何同步。
  • 猜猜当我单击构建时它会有所帮助......哦,这就是我获得的结果而且我没有包括锁主要是为了减少空间。如果真的需要它,还取决于您使用它的目的和方式。是的,不同的类型都可以。持有实例的类甚至可以是一个静态类,它下面有几个单例。
【解决方案3】:

静态类可以像任何其他类一样创建和引用任何对象。它不是一个单例,但你会得到类似的最终结果。静态类在第一次被引用时被“构建”,所以如果你需要在窗口或 UI 发生之前发生一些事情,你仍然需要处理它。

我不知道实际的单例是否更好。有不少人说单例和静态类不好,主要是因为它们使代码更加僵化。在某种程度上,它几乎是一个全局变量。

【讨论】:

  • 单例是坏的,就像静态类(带有数据)是坏的一样——它们只是因为它是静态的而受到批评。如果您仍然保持静态,至少使用已建立的模式(单例)。
猜你喜欢
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多