繁体   English   中英

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

[英]I think I need a static class with a constructor?

因此,对于这个问题中的术语肯定很抱歉,我要事先道歉-我正在尝试自学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 ,因此它似乎他们应该是静态方法。 但是如果是这样,他们如何/何时进行工作以设置所需的字典?

您如何实现的?

您可以使用静态构造函数 保证静态构造函数对于该类仅执行一次,并且在首次使用该类之前即可执行。 静态构造函数是初始化静态属性的好地方。 它可能看起来像:

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

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

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

也许您可以为您的UtilityFunction考虑Singelton设计模式* https://msdn.microsoft.com/zh-cn/library/ff650316.aspx

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

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

创建新的Logic类并将所有内容放入其中。 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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM