2016-02-16 4 views
1

Итак, извиняйтесь заранее за неудовлетворительную терминологию в этом вопросе - я пытаюсь научить себя 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, эта функция также нуждается в словаре для выполнения этой работы, которую нужно установить только один раз. Эта функция будет вызываться много раз на UtilityFunction1.

Итак, с одной стороны, кажется, что UtilityFunction1 и UtilityFunction2 должны быть общедоступными классами, так как они должны иметь конструктор, который заполняет словарь (который включает переменные, петли и вычисления).

С другой стороны, мне нужно только один из UtilityFunction1 и UtilityFunction2, так что кажется, что они должны быть статическими методами. Но если это так, как и когда они выполняют работу по созданию словарей, в которых они нуждаются?

Как вы это достигаете?

+1

синтаксиса для статического конструктора просто 'статический Item() {...}' (см [MSDN] (https://msdn.microsoft.com/en -us/library/k9x6w0hc.aspx)) – Carsten

+0

Статические классы/синглтоны часто нахмурились ... Но на самом деле ошибочно иметь одно для однопользовательского консольного приложения. Теперь, что именно ваша проблема создает статический класс с конструктором? –

+0

Если вам нужен статический класс с конструктором - почему вы не просто это сделали? – TomTom

ответ

2

Вы также можете переместить свою логику за пределы 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 
    } 
} 

товара.cs:

public class Item() { 
    // a bunch of properties 
    public Item() {} 
} 

А затем просто запустите его в своем главном.

Program.cs:

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

Благодарим вас за это элегантное, простое решение, которое вы очень четко объяснили. Очень признателен! – mattstuehler

2

Вы можете использовать static constructor. Статический конструктор гарантированно будет выполняться только один раз для класса и до того, как класс будет использоваться в первый раз. Статический конструктор является очень хорошим местом для инициализации статических свойств. Это может выглядеть так:

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

    static ExampleClass() 
    { 
     Items = new Dictionary<int, Item>(); 
    } 
} 

Однако будьте осторожны со статическими материалами, так как обычно это снижает модульность и проверяемость программы. Поэтому использование одноэлементного шаблона может быть лучшим решением, а не статическим конструктором.

2

Может быть, вы можете думать о Pattern Singelton Design для UtilityFunction * https://msdn.microsoft.com/en-us/library/ff650316.aspx

Вам нужен класс, который имеет только один экземпляр, и вы должны обеспечить глобальную точку доступа к экземпляру.

Смежные вопросы