[英]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.