【问题标题】:Static vs Instance members in MainWindowMainWindow 中的静态与实例成员
【发布时间】:2013-10-21 20:50:36
【问题描述】:

我了解静态和实例的概念,但我很困惑当我有一个只有一个实例的类时应该使用哪个实例,该实例是在我的应用程序开始时调用的实例 (=Application.Current .MainWindow)

我想在我的程序中保留一个我需要的列表,贯穿不同的课程。 我是否应该将其设为静态,因为永远不会存在 2 个 MainWindow 实例?或者我应该让它成为非静态的,因为听起来它属于实例是正确的?

如果我选择使它成为非静态的,这也意味着我总是需要在其他类中使用“(MainWindow)Application.Current.MainWindow”来引用它,这很烦人

在这里将列表设为静态会“不好”吗?

【问题讨论】:

  • 一堆其他类进入这个窗口来操作它拥有的列表通常看起来是错误的。这表明您的程序的控制已反转。这些其他类更有可能触发事件,其中包含应添加/删除的项目等信息。或者,至少,您应该在构造时将列表传递给这些其他类,这样即使这些其他类完全被其他类使用,它们也能正常工作。
  • 你应该遵循你的编码习惯。你认为最适合你的,就用那个。如果没有其他人编辑您的代码可能会提出异议;你没事。代码由您定义。

标签: c# wpf static instance


【解决方案1】:

静态似乎不是什么大问题。如果您觉得奇怪,您可以为您的MainWindow 创建一个“单例”,供程序的其余部分使用。

查看文档:http://msdn.microsoft.com/en-us/library/ff650316.aspx

【讨论】:

  • 嘿哇。我已经使用这种模式很长时间了,我什至没有意识到它有一个名字。多么尴尬。 :)
【解决方案2】:

如果您使用实例模式,它为Dependency InjectionModule Discovery 铺平了道路,这反过来又有助于对使用该服务的组件进行单元测试。

实例模式还提供后期绑定,如果类需要一些直到运行时才知道的东西,这将非常有用。最后,实例模式启用了“可变性”。

如果您的应用程序是通过各种服务的交互构建的,那么静态模式可能更合适。

两者之间的性能和内存占用差异可以忽略不计。

【讨论】:

    【解决方案3】:

    如果没有看到您的代码或了解您的工作文化,很难说。

    恕我直言:只要您关于“只有一个实例”的假设成立,那么您就可以摆脱静态属性和方法。这让我觉得有点可疑。

    如果您是与我一起工作的初级或中级人员,那么我希望您养成使用实例属性、方法和事件的习惯,并在需要时保留使用静态成员。

    只是我的 2c。对此的看法会有所不同。

    上面 Servy 的评论得到了我的认可,顺便说一句。

    【讨论】:

      【解决方案4】:

      我认为将其设为静态会很糟糕,但如果您的程序小而简洁,那么您不太可能会看到副作用,从而得出相同的结论。

      此列表包含可能需要与其他类共享的项目,可以包含在主窗口的单独类中,并且由此类实现的接口可以公开所需的功能,涉及列表访问或操作。

      您可能想尝试阅读“依赖注入”。您可以让 IOC 容器控制列表封装类的生命周期,并且只将接口暴露给其他应用程序类。

      【讨论】:

        猜你喜欢
        • 2015-08-23
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 2011-04-11
        相关资源
        最近更新 更多