让我更准确一点。在我的winforms项目中,我创建了一些类来管理/创建程序的每个部分。我这样做是为了更好地控制我的代码。例如。我有一个管理我的DataGridView控件的类。我将它命名为gridManager,并在其中设置了所有属性,颜色等,并且我还有更改这些设置的方法(例如changeBackgroundColor()等)。 我也为splitContainer中的每个Panel都有这种类。在这些类中,我初始化每个作为面板子项的Control,我将它们添加到该面板中设置所有属性,依此类推。
我写了这一切是为了让你更好地了解这些课程的目的。
现在我的问题是:将这些类设为静态是一种好习惯吗?内部的所有控件和方法都是静态的吗?
起初我让它们非静态但是当我想调用方法(例如)从选项中改变颜色时,我必须将MainForm作为参数传递或者像这样做:
(Application.OpenForm[0] as MainForm).gridManager.changeColor();
它的静态版本使它更容易。但这让我想知道它是否是一件好事。 呃很多解释我希望我不完美的英语不会让它更难理解。 :)
答案 0 :(得分:7)
全球可变状态通常是一个坏主意。
静态方法/类适用于简单的sideeffect自由函数。 Math
和Enumerable
是很好的例子。
另一方面,你想要静态字段内的控件。这些是可变状态,因此应该避免。例如,如果您明天希望有两个表单实例,则需要两个经理类实例。但它是静态的,你现在需要用它重写所有代码。
答案 1 :(得分:3)
与任何事物一样,静态类具有权衡。想到的两个“消极”是
但听起来好像在你的情况下你不会继续做这些类的任何继承,所以也许在这种情况下它会没事。
编辑这假设您正在做类似控制工厂的事情
例如:
var grid = GridManager.CreateGrid(options);
如果您正在做类似
的事情var data = GridManager.GetDataFromGrid(myGrid)
我可能会重新考虑。
答案 2 :(得分:0)
静态类有它们的位置,但这可能不是其中之一,除非它是一个快速而肮脏的应用程序。如果您希望对代码进行自动化测试,那么如果测试中的代码使用静态类作为首选项,则几乎不可能。
使用singleton模式可能更好。这样您就可以在自动化测试期间替换实现。
答案 3 :(得分:0)
最好使用链接到该网格对象的普通类来完成它。如果您需要其他网格对象,则可能需要实例化另一个实例。控制器不是静态类的最佳候选者。
答案 4 :(得分:0)
它既不好也不坏,它只是某些任务的常见模式。
一般来说,您将静态方法用于与类类型相关但不依赖于任何实例数据的功能,经典用法类似于返回类的初始化实例的工厂类型方法附于。
public SomeClass = SomeClass.CreateWithSomeInit(parms);
答案 5 :(得分:0)
静态类肯定有它们的位置,但我认为尽可能使用它们是一个糟糕的建议。
OOP的整个概念是围绕实例构建的,因此您应该在大多数时候使用非静态类。原因?主要是灵活性。根据内部状态,您可以有两个执行相同操作的实例略有不同。您可以拥有相同概念的更多实现,并可以轻松切换它们。您可以使用Inversion of Control容器之类的东西。等等。