Bagaimana cara menggunakan Variabel Global di C #?

101

Bagaimana cara mendeklarasikan variabel sehingga setiap kelas (* .cs) dapat mengakses isinya, tanpa referensi instance?

Mas Ajum
sumber

Jawaban:

123

Dalam C#Anda tidak dapat mendefinisikan variabel global yang sebenarnya (dalam arti bahwa mereka tidak termasuk dalam kelas apa pun).

Karena itu, pendekatan paling sederhana yang saya tahu untuk meniru fitur ini terdiri dari penggunaan a static class, sebagai berikut:

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
}

Anda kemudian dapat mengambil nilai yang ditentukan di mana saja di kode Anda (asalkan itu bagian dari yang sama namespace):

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

Untuk menangani ruang nama yang berbeda, Anda dapat:

  • mendeklarasikan Globalskelas tanpa menyertakannya ke dalam suatu spesifik namespace(sehingga itu akan ditempatkan di namespace aplikasi global);
  • masukkan perintah using yang tepat untuk mengambil variabel dari yang lain namespace.
Tommaso Belluzzo
sumber
@ Zarathos apakah kelas harus statis juga?
kosnkov
4
Yah itu tidak perlu tapi saya tidak mengerti mengapa Anda harus membuat contoh itu.
Tommaso Belluzzo
Jika Anda harus membuat instance per definisi tidak lagi "global", bukan bagian dari status aplikasi
Viking
Hai, apa bedanya jika saya tidak mengetikkan kata kunci statis di kelas? Saya hanya membuat string FILE_NAME statis, saya mencoba dan itu masih berhasil untuk saya.
Tomer Cahal
1
Tanpa atribut statis kelas Anda akan dapat dipakai (Globals g = new Globals ()). Itu tidak mengubah perilaku variabel statis yang dideklarasikan di dalamnya, tetapi tidak terlihat sangat berguna.
Tommaso Belluzzo
74

Tidak ada variabel global di C #. Titik.

Anda dapat memiliki anggota statis jika Anda ingin:

public static class MyStaticValues
{
   public static bool MyStaticBool {get;set;}
}
Federico Berasategui
sumber
Meskipun saya setuju, dapatkah Anda menjelaskan mengapa tidak ada yang namanya variabel global di C #? Saya mencoba memikirkan alasan yang bagus mengapa staticcontoh yang Anda berikan tidak dapat benar-benar dianggap sebagai variabel global.
cregox
3
@cawas karena konsep "variabel global" (tergantung entah dari mana, mengambang di limbo, tidak termasuk dalam kelas apa pun) bertentangan dengan sifat OOP. dan C # berorientasi objek secara ketat.
Federico Berasategui
Ya, itu semua konsep yang saya setujui. Tetapi dengan membuat anggota statis itu, Anda baru saja membuat semacam var global. Apa bedanya dengan variabel global yang Anda katakan tidak ada? Saya ingin melihat contoh praktis.
cregox
1
Saya merasa Anda menghindari pertanyaan saya atau saya tidak jelas. Tapi aku sudah menjawabnya. Di sini: stackoverflow.com/a/20010543/274502
cregox
7
Sekarang saya menyadari apa yang saya maksud adalah bahwa anggota statis secara konseptual dan praktis vars global (kecuali mungkin untuk hal heap itu , yang hanya membuat perbedaan kecuali jika Anda menulis kode yang tidak aman atau melakukan semacam interoperating berat dengan kode yang tidak dikelola ). Jadi saya tidak tahu mengapa ada orang yang mengatakan " tidak ada yang namanya variabel global di csharp ". Itu sangat membuatku bingung.
cregox
23

Pertama, periksa apakah Anda benar-benar membutuhkan variabel global daripada menggunakannya secara terang-terangan tanpa mempertimbangkan arsitektur perangkat lunak Anda.

Mari kita asumsikan lulus ujian. Bergantung pada penggunaan, Globals mungkin sulit untuk di-debug dengan kondisi balapan dan banyak "hal buruk" lainnya, yang terbaik adalah mendekatinya dari sudut di mana Anda siap untuk menangani hal-hal buruk seperti itu. Begitu,

  1. Bungkus semua variabel Global tersebut menjadi satu statickelas (untuk pengelolaan).
  2. Memiliki Properti alih-alih bidang (= 'variabel'). Dengan cara ini, Anda memiliki beberapa mekanisme untuk mengatasi masalah apa pun terkait penulisan secara bersamaan ke Globals di masa mendatang.

Garis besar dasar untuk kelas seperti itu adalah:

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.
}

Penggunaan dari kelas lain (dalam namespace yang sama)

// Read
bool areWeAlive = Globals.Expired;

// Write
// past deadline
Globals.Expired = true;
Sid
sumber
4

Fitur yang berguna untuk ini adalah using static

Seperti yang dikatakan orang lain, Anda harus membuat kelas untuk global Anda:

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

Tetapi Anda dapat mengimpornya seperti ini agar tidak lagi menulis nama kelas di depan properti statisnya:

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