Как создать глобальный объект в библиотеке C# [дубликат]

Возможные Дубликаты:
лучший способ сделать данные (которые могут измениться во время выполнения) доступными для всего приложения?

У меня есть библиотека на C#.

  1. может ли библиотека иметь глобальные объекты/переменные?
  2. может ли метод инициализации для этих объектов автоматически выполняться из библиотеки при запуске основного проекта или мне нужно сделать его статическим методом и запустить его из главный проект?

3 ответов


В C# я всегда использую статические классы для обеспечения этой функции. Статические классы подробно описаны здесь, но вкратце они содержат только статические члены и не являются экземплярами-по существу, они являются глобальными функциями и переменными, доступными через их имя класса (и пространство имен.)

вот простой пример:

public static class Globals
{
    public static string Name { get; set; }
    public static int aNumber {get; set; }
    public static List<string> onlineMembers = new List<string>();

     static Globals()
     {
        Name = "starting name";
        aNumber = 5;
     }
}

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

в другом месте вашей программы вы можете просто сказать:

Console.WriteLine(Globals.Name);
Globals.onlineMemeber.Add("Hogan");

статические объекты "создаются" только один раз. Таким образом, везде, где ваше приложение использует объект будет из одного и того же места. Они по определению глобальны. Чтобы использовать этот объект в нескольких местах просто указать имя объекта и элемент, который вы хотите открыть.


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


вы можете использовать public статические свойства в классе как глобальные объекты / переменные.

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


может ли библиотека иметь глобальные объекты/переменные?

да c# может иметь статические классы, статические члены. Но никакие переменные не могут существовать вне класса.

может ли метод инициализации для этих объектов автоматически выполняться из библиотеки при запуске основного проекта или мне нужно сделать его статическим методом и запустить его из основного проекта?

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

Интересная статья, связанная со статическими инициализаторами