C# 静态类的可接受使用?

C# 静态类的可接受使用?,c#,static,static-classes,C#,Static,Static Classes,拥有一个原本不是静态的类 public class SapApprovalHandler { private static SapGs3DataSet sapGs3DataSet; static SapApprovalHandler() { try { // Actually fills the dataset sapGs3DataSet = new SapGs3DataSet("SAP"); }

拥有一个原本不是静态的类

public class SapApprovalHandler {

    private static SapGs3DataSet sapGs3DataSet;

    static SapApprovalHandler() {
        try {
            // Actually fills the dataset
            sapGs3DataSet = new SapGs3DataSet("SAP");
        }
        catch {
            throw new ApplicationException("Unable to create the SAP-GS3 DataSet");
        }
    }

    public static XElement ProcessApprovals(XElement SapData) {
        // Basically updates the dataset
    }

}
在构建类时,我决定(1)除非显式刷新数据集,否则我不想重新填充数据集,(2)我是这些数据的守门员;其他人不应该更新它们。此类是从WCF服务中调用的

除了我想要重用的数据集之外,没有状态;这个类上的每个函数都可以是静态的。但是将类设置为静态是可以接受的吗?而不是实例化它并在WCF上使用成员级别变量来保存它。我不确定这两种方法之间是否有区别

为了减少争论,让我问:使类成为静态的缺点是什么?我不想这样做的原因

请随意对该方法进行总体评论;通常,我会在ProcessApprovals中创建数据集,并在调用结束时处理它,但我真的不需要经常刷新数据,如果需要的话(我有一个单独的数据集,其中包含更多瞬态数据,每次更新时都会刷新;SapGs3DataSet数据实际上不会更改)

另一种方法是使用企业库(EnterpriseLibrary)缓存数据集,这将允许我设置诸如过期和刷新数据的方法等内容

我将根据我不应该这样做的最有力的理由来选择答案。如果没有任何强有力的理由支持不这样做,我会选择最合理的答案来解释为什么这样做是可以的

蒂亚

杰姆斯

< P>我会考虑在对象上使用缓存而不是使其静态化。静态类通常更难测试和在测试中使用。即使数据是静态的,也会增加运行自动化测试的难度,因为您需要采取额外的步骤来设置测试数据,添加代码只是为了满足测试需求。使用缓存可以实现相同的效果,如果出于其他目的需要空间,还可以刷新数据。如果需要,您可以在从缓存刷新时自动重新填充对象,这样您的请求通常不会出现任何性能下降。

如果将其设置为静态,然后改变主意并希望保持某种状态,那你就不能了。

可能重复我在这里读过一些关于静态与非静态的文章。。。我也查看了你链接中的文章。我想我要的是一个特定的场景。最让我困惑的是数据集。。。将其作为静态成员是否可以接受?如果是这样,那么类的其余部分肯定是静态的。但是静态数据集让我有点恼火,尽管我的逻辑似乎很合理静态字段的最大问题是只有它的副本。如果您需要多个实例,那么这将成为一个问题。如果你发现自己在处理多线程,情况会更糟。有更好的方法只保存一个字段的副本。是的,我倾向于tvanfosson的答案,即在类外缓存它。这将使类是静态的,但保持数据集在手边。它还可以让我指定刷新数据集的代码和规则。我同意,我想得越多,缓存越多似乎是更好的方法。谢谢