簡體   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