所以,对于这个问题中肯定很糟糕的术语,我要提前道歉 - 我正在尝试自学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
将多次调用此函数。
因此,一方面,似乎UtilityFunction1
和UtilityFunction2
应该是公共类,因为它们需要一个填充Dictionary的构造函数(包括变量,循环和计算)。
另一方面,我只需要 一个 UtilityFunction1
和UtilityFunction2
,所以看起来它们应该是静态方法。但如果是这样的话,他们是如何/何时进行设置他们需要的词典的工作?
你是如何实现这一目标的?
答案 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();
}
}