Подтвердить что ты не робот

Как использовать глобальные переменные в С#?

Как мне объявить переменную, чтобы каждый класс (*.cs) мог получить доступ к ее содержимому без ссылки на экземпляр?

4b9b3361

Ответ 1

В C# вы не можете определить истинные глобальные переменные (в том смысле, что они не принадлежат ни одному классу).

При этом самый простой подход, который я знаю, чтобы подражать этой функции, заключается в использовании static class следующим образом:

public static class Globals
{
    public const Int32 BUFFER_SIZE = 512; // Unmodifiable
    public static String FILE_NAME = "Output.txt"; // Modifiable
    public static readonly String CODE_PREFIX = "US-"; // Unmodifiable
}

Затем вы можете получить определенные значения в любом месте своего кода (при условии, что он является частью одного и того же namespace):

String code = Globals.CODE_PREFIX + value.ToString();

Чтобы иметь дело с разными пространствами имен, вы можете:

  • объявить класс Globals без включения его в определенное namespace (чтобы оно было помещено в пространство имен глобальных приложений);
  • вставьте правильную директиву для извлечения переменных из другого namespace.

Ответ 2

В С# нет такой вещи, как глобальная переменная. Период.

Если вы хотите, вы можете иметь статические элементы:

public static class MyStaticValues
{
   public static bool MyStaticBool {get;set;}
}

Ответ 3

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

Предположим, что он проходит тест. В зависимости от использования, Globals может быть трудно отлаживать с условиями гонки и многими другими "плохими вещами", лучше подойти к ним под углом, где вы готовы справиться с такими плохими вещами. Итак,

  • Оберните все такие глобальные переменные в один класс static (для управляемости).
  • Имейте свойства вместо полей (= 'variables'). Таким образом, у вас есть некоторые механизмы для решения любых проблем с одновременной записью в Globals в будущем.

Основной план для такого класса будет:

public class Globals
{
    private static bool _expired;
    public static bool Expired 
    {
        get
        {
            // Reads are usually simple
            return _expired;
        }
        set
        {
            // You can add logic here for race conditions,
            // or other measurements
            _expired = value;
        }
    }
    // Perhaps extend this to have Read-Modify-Write static methods
    // for data integrity during concurrency? Situational.
}

Использование других классов (внутри одного и того же пространства имен)

// Read
bool areWeAlive = Globals.Expired;

// Write
// past deadline
Globals.Expired = true;

Ответ 4

Полезной функцией для этого является using static

Как уже говорили другие, вы должны создать класс для ваших глобалов:

public static class Globals {
    public const float PI = 3.14;
}

Но вы можете импортировать его так, чтобы больше не записывать имя класса перед его статическими свойствами:

using static Globals;
[...]
Console.WriteLine("Pi is " + PI);