Как объявить переменную, чтобы каждый класс (* .cs) мог получить доступ к ее содержимому без ссылки на экземпляр?
Ответы:
В нем 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
.В C # нет такой вещи, как глобальная переменная. Период.
Вы можете иметь статические члены, если хотите:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
пример, который вы предоставили, на самом деле нельзя рассматривать как глобальную переменную.
Сначала проверьте, действительно ли вам нужна глобальная переменная, вместо того, чтобы использовать ее явно, без учета архитектуры вашего программного обеспечения.
Предположим, он прошел тест. В зависимости от использования Globals может быть трудно отлаживать из-за условий гонки и многих других «плохих вещей», лучше всего подходить к ним с той точки зрения, с которой вы готовы справиться с такими плохими вещами. Так,
static
класс (для удобства управления).Базовая схема такого класса:
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;
Для этого полезной функцией является using static
Как говорили другие, вам нужно создать класс для своих глобальных объектов:
public static class Globals {
public const float PI = 3.14;
}
Но вы можете импортировать его так, чтобы больше не писать имя класса перед его статическими свойствами:
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);