Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我想我需要一个带构造函数的静态类?_C# - Fatal编程技术网

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

C# 我想我需要一个带构造函数的静态类?,c#,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() { } } 接下来,我需要一个UtilityFunctio

因此,我要为这个问题中的糟糕术语提前道歉——我正在努力自学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
s来使用它们进行一些计算。此函数需要设置一个
字典
来完成其工作。即使它会被多次调用,字典也只能设置一次

我还需要一个
实用功能2
。与
实用功能1
类似,此功能也需要一个字典来完成其工作,只需设置一次。
UtilityFunction1
将多次调用此函数

因此,一方面,似乎
UtilityFunction1
UtilityFunction2
应该是公共类,因为它们需要一个填充字典的构造函数(涉及变量、循环和计算)

另一方面,我只需要一个
UtilityFunction1
UtilityFunction2
,所以它们似乎应该是静态方法。但如果是这样的话,他们如何/何时着手建立他们需要的词典

您是如何做到这一点的?

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

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

    static ExampleClass()
    {
        Items = new Dictionary<int, Item>();
    }
}
公共类示例类
{
公共静态只读索引项;
静态示例类()
{
Items=新字典();
}
}
但是,要小心使用静态内容,因为它通常会降低程序的模块性和可测试性。因此,使用单例模式可能是比静态构造函数更好的解决方案。

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

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

    static ExampleClass()
    {
        Items = new Dictionary<int, Item>();
    }
}
公共类示例类
{
公共静态只读索引项;
静态示例类()
{
Items=新字典();
}
}

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

也许您可以为实用功能考虑单例设计模式*

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


也许你可以为你的实用功能想出Singelton设计模式*

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


你也可以把你的逻辑移到主逻辑之外。 迫使您使用静态的是主方法(以及它通常所属的类)是静态的。这迫使所有其他事物(字段、方法、事件,您可以命名)也是静态的。治疗头痛的最简单方法是创建一个新类来容纳所有你需要的东西

创建新的逻辑类并将所有内容放入其中。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
    }
}
然后在主屏幕上运行它

Program.cs:

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

你也可以把你的逻辑移到主逻辑之外。 迫使您使用静态的是主方法(以及它通常所属的类)是静态的。这迫使所有其他事物(字段、方法、事件,您可以命名)也是静态的。治疗头痛的最简单方法是创建一个新类来容纳所有你需要的东西

创建新的逻辑类并将所有内容放入其中。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
    }
}
然后在主屏幕上运行它

Program.cs:

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

静态构造函数的语法只是
static Item(){…}
(请参阅)静态类/单例通常不受欢迎。。。但使用一对一的控制台应用程序并没有错。现在,用构造函数创建静态类的问题到底是什么?如果您需要一个带构造函数的静态类,为什么不直接创建它?为什么要让它们成为静态的?没有规则说你需要制作只需要一个静态实例的东西!我有一个建议,因为你的问题仍然有点模糊:使用一个非静态类编写一个工作解决方案,让他们提交给codereview.se并检查你得到的反馈。静态构造函数的语法只是
static Item(){…}
(请参阅)静态类/单例经常不受欢迎。。。但使用一对一的控制台应用程序并没有错。现在,用构造函数创建静态类的问题到底是什么?如果您需要一个带构造函数的静态类,为什么不直接创建它?为什么要让它们成为静态的?没有规则说你需要制作只需要一个静态实例的东西!我有一个建议,因为你的问题仍然有点模糊:使用非静态类编写一个工作解决方案,然后提交给codereview.se,检查你得到了什么反馈。感谢你提供了这个优雅、简单的解决方案,你已经非常清楚地解释了。非常感谢!感谢您提供了这个优雅、简单的解决方案,您已经非常清楚地解释了这一点。非常感谢!