我想我需要一个带构造函数的静态类?

时间:2016-02-16 07:16:15

标签: c#

所以,对于这个问题中肯定很糟糕的术语,我要提前道歉 - 我正在尝试自学C#,并努力学习一些概念。

在伪代码中,我有类似的东西:

static void Main()
{
    // This will create lots of "Item"(s), and do stuff with them
}
public class Item
{
    // a bunch of properties
    public Item()
    {
    }
}

接下来,我需要一个UtilityFunction1来做一些工作 - 它会在Main()期间多次调用并传递Item来用它们进行一些计算。此功能需要设置Dictionary来完成其工作。即使它被多次调用,但词典只应设置一次。

我还需要UtilityFunction2。像UtilityFunction1一样,这个函数也需要一个Dictionary才能完成它的工作,这应该只设置一次。 UtilityFunction1将多次调用此函数。

因此,一方面,似乎UtilityFunction1UtilityFunction2应该是公共类,因为它们需要一个填充Dictionary的构造函数(包括变量,循环和计算)。

另一方面,我只需要 一个 UtilityFunction1UtilityFunction2,所以看起来它们应该是静态方法。但如果是这样的话,他们是如何/何时进行设置他们需要的词典的工作?

你是如何实现这一目标的?

3 个答案:

答案 0 :(得分:2)

您可以使用static constructor。保证静态构造函数只为类执行一次,并且在第一次使用类之前。静态构造函数是初始化静态属性的一个非常好的地方。它可能看起来像:

public class ExampleClass
{
    public static readonly IDictionary<int, Item> Items;

    static ExampleClass()
    {
        Items = new Dictionary<int, Item>();
    }
}

但是,请注意静态内容,因为它通常会降低程序的模块性和可测试性。因此,使用单例模式可能是更好的解决方案,而不是静态构造函数。

答案 1 :(得分:2)

也许你可以想到你的UtilityFunction的Singelton设计模式* https://msdn.microsoft.com/en-us/library/ff650316.aspx

  

您需要一个只有一个实例的类,并且需要提供对该实例的全局访问点。

答案 2 :(得分:2)

你也可以将你的逻辑移到Main之外。 迫使你使用静态的是Main方法(通常是它的一部分)是静态的。这迫使所有其他事物(字段,方法,事件,你命名它)也是静态的。治愈这种头痛最简单的方法就是创造新的课程,以容纳你需要的所有东西。

创建新的逻辑类并将所有内容放入其中。 Item类保持不变。为清晰起见,您可以将其移至单独的文件中。

Logic.cs:

public class Logic() {
    private Dictionary<object,object> dict1 = new Dictionary<object,object>
    private Dictionary<object,object> dict2 = new Dictionary<object,object>

    public Logic() {
        // some logical initializations here
    }

    private void UtilityFunction1 (Item itemToWorkOn) {
        // you can access dict1 directly from here
    }

    private void UtilityFunction2 (Item itemToWorkOn) {
        // you can access dict2 directly from here
    }

    public void Run() {
        // run UtilityFunction1() many times
        // run UtilityFunction2() many times
    }
}

Item.cs:

public class Item() {
    // a bunch of properties
    public Item() {}
}

然后在你的Main中运行它。

的Program.cs:

static class Program {
    static void Main() {
        new Logic.Run();
    }
}