C# Global Değişkenler dersimiz ile C# eğitimlerine devam ediyoruz. C# global degiskenler özel bir tür değişken değildir. Tanımlamaların önüne public ifadesi yazarak değişkenleri, classları yada nesneleri global hale yani projenin her yerinden ulaşılabilir hale getirebiliriz. Bu dersi konu anlatımından çok projeler içerisinde kullanım şekillerine örnekler vermek amacı ile hazırladım.
Öncelikle bir değişkeni nasıl global yaparız onu görelim.
C# Global Degiskenler
1 – C Sharp Global degiskenler, eventler yada voidler içerisinde tanımlanamazlar. Mutlaka en dışarıda olmalıdırlar.
2 – Bir değişkeni global hale getirdiğimizde projedeki tüm formlar ve classlardan ilgili değişkene ulaşabiliriz.
Aşağıdaki kodlarda global bir değişkenin nasıl tanımladığı gösterilmiştir.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace mustafabukulmez_com { public partial class Form1 : DevExpress.XtraEditors.XtraForm { public Form1() { InitializeComponent(); } //Public kelimesi değişkenleri global hale getirmiştir. public int _int0 = 0, _int1 = 1; public bool _bool = false; private void Form1_Load(object sender, EventArgs e) { } } }
Tabi ki başka bir formda direk değişkenini adını yazarak ulaşamamaktayız. Önce formu tanımlayıp sonrasında formdaki değişkene ulaşabiliriz. Şimdi bu örnek projeye ikinci formu ekledim.
Proje çalıştığında Form1 açılacak.
Form1’e de bir buton ekledim ve Form2’yi çağırdım.
Form2’ye de bir buton ekledim ve tekrar Form1’i çağırdım. Form1’i çağırırken de Form1 içerisindeki global değişkenlere Form2’den değer ataması yaptım.
Form1 açıldığında ise bir MessageBox ile değerleri ekrana yazdırdım.
MessageBox hakkındaki ayrıntılı yazım için tıklayabilirsiniz.
Form1’deki kodlar
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace mustafabukulmez_com { public partial class Form1 : DevExpress.XtraEditors.XtraForm { public Form1() { InitializeComponent(); } public int _int0 = 0, _int1 = 1; public bool _bool = false; private void Form1_Load(object sender, EventArgs e) { } private void simpleButton1_Click(object sender, EventArgs e) { Form2 fr = new Form2(); fr.ShowDialog(); // ShowDialog ile açtğımızdan dolayı Form2 kapanana kadar alttaki mesajlar gösterilmez. // Form2 kapandığında ShowDialog dan sonraki kodlar çalışır. // Show ile açsaydık form açıldıkan sonra hemen mesajlar gösterilirdi. MessageBox.Show(_int0.ToString()); MessageBox.Show(_int1.ToString()); MessageBox.Show(_bool.ToString()); } } }
Form2’deki Kodlar
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using DevExpress.XtraEditors; namespace mustafabukulmez_com { public partial class Form2 : DevExpress.XtraEditors.XtraForm { public Form2() { InitializeComponent(); } private void simpleButton1_Click(object sender, EventArgs e) { Form1 fr = new Form1(); // global değişkenlerimizin olduğu formu tanımladık fr._bool = true; // Form1 adlı formda tanımladığımız global değişkene değer atadık. fr._int0 = 0; // Form1 adlı formda tanımladığımız global değişkene değer atadık. fr._int1 = 1; // Form1 adlı formda tanımladığımız global değişkene değer atadık. fr.ShowDialog(); // ShowDialog ile açılan form hiçbir şekilde önceki formun altına geçmez. // Form açıldığında, form kapatılana kadar en üstte kalır. //fr.Show(); // Show ile açılan form diğer fomların altında kalabilir. // Form açıldığından önceki forma tıkladığınızda, açılan form arkadaki formun altında kalacaktır. } } }
Kodlar üzerinde gerekli olan ve önemli gördüğüm açıklamaları yazdım. Formlar arası veri aktarımı dersimde bu konuya da değinmiştik.
Şimdi devam edelim.
Formlar arasındaki bu şekilde veri gönderebiliyoruz ama bizim daha önemli konular var. Bir senaryo üzerinden gidelim.
Diyelim ki birden fazla kişinin kullanacağı bir proje hazırladınız. Bu kişilerin yaptığı işlemleri nasıl takip edeceğiz? Bu kaydı kim açtı?, Bu kaydı kim değiştirdi? yada Bu kaydı kim sildi? Kullanıcı, giriş ekranından giriş yaptığında kullanıcı adını, kodunu yada ID’sini bir yerde tutup, her işlem yaptığında koyduğumuz yerden alıp insert, update yada delete gibi işlemlerde database’e yazmalıyız ki işlemi kimin yaptığını bilelim değil mi? Burada benim her zaman kullandığım yöntemi paylaşacağım.
Projemizin ana dizinine, Metodlar, Classlar gibi içerisinde class ‘larımızı tutacağımız bir klasör açalım. (Tercihim Metodlar’dır). Metodlar adında bir klasör açtım ve klasör üzerinde sağ tık yaparak Add, Class dedik ve açılan ekranda class’ın adını yazdık. Ben, GlobalClass adını verdim.
NOT: Büyük uygulamalarda yada büyüme potansiyeli olan projelerde mutlaka klasörleme kullanın. Atıyorum, cari işlemleri için ayrı bir klasör, stok işlemleri için ayrı bir klasör olsun. Bu şekilde hem işinizi profesyonelliştirirsiniz, hem düzgün görünür hemde aradığınız formları daha kolay bulursunuz.
Öncelikle projemize bir login formu ekleyin, tasarımını yapın ve giriş işlemleri kodlarınızı yazın. Kısacası login formu tamam olsun.
Şimdi GlobalClass dosyanızı açın ve şu şekilde kodlarınızı ekleyin.
Class’ı ilk açtığınızda kodlar şöyle olacaktır.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace mustafabukulmez_com.Metodlar { class GlobalClass { } }
Kullanıcı bilgilerini tutacağımız değişkenleri ile birlikte GlobalClass’ımız bu şekilde olacaktır.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace mustafabukulmez_com.Metodlar { // Class 'ı global yaptık. public class GlobalClass { public static int Aktif_KullaniciKodu = 0; public static string Aktif_KullaniciAdi = ""; } }
Şimdide login formuzun kodlarını verelim. Ben hep kullandığım yöntemi açıklamalar ile birlikte yazdım.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using DevExpress.XtraEditors; namespace mustafabukulmez_com { public partial class XtraForm1 : DevExpress.XtraEditors.XtraForm { public XtraForm1() { InitializeComponent(); } private void btn_giris_Click(object sender, EventArgs e) { DataTable dt = Sql.ShowTable("select kul_adi_soyadi as ADI from kullanicilar where kul_kodu = " + txt_kullanici_kodu.Text + " and kul_sifre = '" + txt_kullanici_sifre.TExt + "'"); // Sql.comscalar kısmı, kendi sql class'ımı hazırladığımdan dolayıdır. // bu class'ta sql bağlantısını açıp, istediğim sorguyu çalıştırıp geri datatable gönderir. if (dt.Rows.Count > 0) // sql sorgusu sonucunda şartlara uyan satır var ise kullanıcı bilgilerini doğru yazmıştır. // satır sayısı 0 dan büyükse şartı bunu kontrol etmektedir. { AnaMenu fr = new AnaMenu(); Metodlar.GlobalClass.Aktif_KullaniciKodu_1 = int.Parse(txt_kullanici_kodu.Text); // global değişkene değerini atadık. // değişken int türünde olduğundan textbox tan gelen veriyi int yapmamız gerekiyor. Metodlar.GlobalClass.Aktif_KullaniciAdi_1 = dt.Rows[0]["ADI"].ToString(); // global değişkene değerini atadık. // Çalıştırdığımız sorgudan gelen kullanıcı adını alıp kullanıcı adını tutacak değişkene gönderdik. this.Hide(); // Login formunu gizledik. fr.ShowDialog(); // AnaMenu formunu açtık } else { MessageBox.Show("Kullanıcı Kodu yada Şifre Hatalı", "Yanlış Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Stop); } } } }
NOT: Yukarıdaki kullanım şeklini performans açısından daha iyi olduğunu düşündüğüm için bu şekilde uyguluyorum.
- Sorgu da sadece kullanıcı adı yerine* yazarak tüm bilgilerini çekebilirdim.Bu da performans açıcından kötü olurdu.
- Kullanıcı kodunu yazdığı anda formdaki bir labale kullanıcı adını otomatik getirebilirdim. Bu hem fazladan kod hem de fazladan sorgu demektir.
- Sorguyu * ile çalıştırıp alt kısımda kullanıcı adı için tekrar bir sorgu da çalıştırabilirdim. Fazladan sorgu…
“Ya bu kadardan ne olacak salise bile değil” şeklinde düşünüyor olabilirsiniz.
Performans sorunlarının yaşanmasındaki sebep işte budur.
Bu kadardan bir şey olmaz diye diye o saliseler birikip saniyeler sonrada dakikalar olmaya başlıyor.
Şimdi de Login formundan gelen kodları AnaMenu formumuzun başlığına yazdıralım.
Buradaki dikkat etmeniz gereken kısım, değişkenlerin önünde yazan Static ibaresidir. Neden Static yazdığımızı kullanım farkları ile birazdan anlatacağım.
private void Form1_Load(object sender, EventArgs e) { //Değişkenleri static olarak yazdığımızda kullanım şekli böyle olacaktır. this.Text = "Kullanıcı Kodu: " + Metodlar.GlobalClass.Aktif_KullaniciKodu_1 + " | Kullanıcı Adı: " + Metodlar.GlobalClass.Aktif_KullaniciAdi_1; // Değişkenleri static olarak belirtmezsek Metodlar.GlobalClass glb = new Metodlar.GlobalClass(); // Tabiki bu tanımlamayı en dışarda yapmamız gerekmektedir. // Tanımlamayı void içerisinde yaparsak sadece tanımlama yaptığımız void içerisinde kullanabiliriz. // ilk önce class'ı yukarıdaki şekilde tanıtıp // Global değişkenlerimizi de bu şekilde kullanacaktık. this.Text = "Kullanıcı Kodu: " + glb.Aktif_KullaniciKodu_2 + " | Kullanıcı Adı: " + glb.Aktif_KullaniciAdi_2; }
Yukarıdaki kodları incelediğimizde kullanım şekilleri arasındaki farkları görebilirsiniz. Bana soracak olursanız ben hep ilk kullanım şeklinde kullanıyorum. Yani değişkenleri static olarak belirtip class’ı tanıtımı yapmadan kullanıyorum. Siz istediğiniz şekilde kullanabilirsiniz.
Kodlarımızı açıklarsak;
Login formu ile sisteme giriş yapan kullanıcının bilgilerini GlobalClass’a aldık ve oradan da AnaMenu üzerinden çağırıp, AnaMenu formumuzun başlığına yazdırdık.
Program kapanana yada değişkenleri manuel olarak değiştirmediğimiz sürece o bilgiler değişkenlerde tutulacaktır. Artık kullanıcı kodunu ve kullanıcı adını istediğiniz her form yada class’ta kullanabilirsiniz.
Nesneleri public yapabilmek için ise iki yol vardır.
Birincisi nesne üzerinde sağ tık yapıp Properties / Özellikler seçeneğine tıklayın. Özellikler kısmından Modifiers seçeneğini bulun ve o kısmı Public yapın.
İkinci yöntem ise, Solution Explorer de nesnenin olduğu formun solundaki ok işaretine tıklayın. Designer.cs yazan dosyayı açın. Oradan public yapacağınız nesneyi bulun ve Private yazan kısmı Public olarak değiştirin.
C# global degiskenler dersimiz bu kadar dostlar. Bilgiden çok yöntem anlatan güzel bir ders oldu. Aklınıza takılan soruları yorum kısmından yada iletişim sayfasındaki mail adresimden sorabilirsiniz.
C Sharp Eğitim Seti ve ERP Programlama ders listesine ulaşmak için tıklayınız. Github Profilim için bağlantıya tıklayabilirsiniz.
Sağlıcakla ve takipte kalın. ;)