Odpowiedzi:
W C#
nie można zdefiniować prawdziwych zmiennych globalnych (w tym sensie, że nie należą one do żadnej klasy).
Biorąc to pod uwagę, najprostsze podejście, jakie znam, aby naśladować tę funkcję, polega na użyciu w static class
następujący sposób:
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
}
Następnie możesz pobrać zdefiniowane wartości w dowolnym miejscu kodu (pod warunkiem, że jest częścią tego samego namespace
):
String code = Globals.CODE_PREFIX + value.ToString();
Aby poradzić sobie z różnymi przestrzeniami nazw, możesz:
Globals
klasę bez dołączania jej do konkretnej namespace
(aby została umieszczona w globalnej przestrzeni nazw aplikacji);namespace
.Nie ma czegoś takiego jak zmienna globalna w C #. Kropka.
Jeśli chcesz, możesz mieć statycznych członków:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
przykładu, który podałeś, nie można tak naprawdę uznać za zmienną globalną.
Najpierw sprawdź, czy naprawdę potrzebujesz zmiennej globalnej, zamiast używać jej rażąco, bez uwzględnienia architektury oprogramowania.
Załóżmy, że przejdzie test. W zależności od zastosowania, Globals mogą być trudne do debugowania z warunkami wyścigu i wieloma innymi „złymi rzeczami”, najlepiej jest podejść do nich z punktu, w którym jesteś przygotowany na takie złe rzeczy. Więc,
static
klasę (w celu ułatwienia zarządzania).Podstawowy zarys takiej klasy wyglądałby następująco:
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.
}
Użycie z innych klas (w tej samej przestrzeni nazw)
// Read
bool areWeAlive = Globals.Expired;
// Write
// past deadline
Globals.Expired = true;
Przydatną funkcją jest do tego using static
Jak powiedzieli inni, musisz utworzyć klasę dla swoich globali:
public static class Globals {
public const float PI = 3.14;
}
Ale możesz to zaimportować w ten sposób, aby nie zapisywać już nazwy klasy przed jej właściwościami statycznymi:
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);