Как мне объявить переменную, чтобы каждый класс (*.cs) мог получить доступ к ее содержимому без ссылки на экземпляр?
Как использовать глобальные переменные в С#?
Ответ 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);