[英]Effective use of static fields and methods in a class? Initialised in the constructor or in declaration? I need guidance
[英]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
将多次调用此函数。
因此,一方面,看来UtilityFunction1
和UtilityFunction2
应该是公共类,因为它们需要一个用于填充Dictionary的构造函数(其中涉及变量,循环和计算)。
在另一方面,我只需要一个 UtilityFunction1
和UtilityFunction2
,因此它似乎他们应该是静态方法。 但是如果是这样,他们如何/何时进行工作以设置所需的字典?
您如何实现的?
您可以使用静态构造函数 。 保证静态构造函数对于该类仅执行一次,并且在首次使用该类之前即可执行。 静态构造函数是初始化静态属性的好地方。 它可能看起来像:
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.