Birçok kaynakta konu thread’lere getirilmeden önce Windows ile işletilen bilgisayarda aynı anda birden fazla programın çalıştırıldığından söz ediliyor. Hal bu ki konu Windows ve çalıştırılan uygulamalar olduğunda, thread yerine process’lere atıfta bulunmak gerekir. Sıra C# uygalaması yazarak thread’lerden söz etmeye geldiğinde ortada bir tek uygulamanın olduğunu gören okurun kafası karışmaktadır.
20 Eylül 2017 Çarşamba
Process’leri Tarif Edip Thread'leri Anlatmak
Birçok kaynakta konu thread’lere getirilmeden önce Windows ile işletilen bilgisayarda aynı anda birden fazla programın çalıştırıldığından söz ediliyor. Hal bu ki konu Windows ve çalıştırılan uygulamalar olduğunda, thread yerine process’lere atıfta bulunmak gerekir. Sıra C# uygalaması yazarak thread’lerden söz etmeye geldiğinde ortada bir tek uygulamanın olduğunu gören okurun kafası karışmaktadır.
31 Ağustos 2017 Perşembe
Event Kavramını Anlatırken Aldığım Birkaç Not
En başta Windows’un “mesajlar” ile işlem yapan bir
işletim sistemi olduğunu ve kullanıcının yaptığı işlemlere göre ilgili
uygulamaya mesajlar gönderdiğini hatırlamak gerekir. C# uygulaması dahilinde
gerçekleşen olayları, Windows’la ilgili olaylar ile karıştırmamak gerekir.
Kullanıcının klavye ve fare ile yaptığı işlemleri temsil eden mesajları Windows
uygulamaya gönderir. C# uygulaması bu mesajları alıp delegate’ler aracılığı ile
ilgili metotları işletir.
Olayların zor anlaşılmasının en önemli nedeni bizce
şudur:
* C# ve .NET
programcılığı konusunda yolun başında olan birisine forma yerleştirilen “button1”
nesnesinin Click olayının nasıl kullanıldığı, Click olayını temsil eden metodun
nasıl hazırlandığı anlatılır.
* Okurumuz veya programcı adayımız bunları
okuduktan sonra kafasında olaylar ilk gördüğü şekliyle netleşir. Programcı
adayı için artık olay demek Properties
penceresinde Button veya başka bir sınıfın olaylarını listeleyip olayın adı
üzerinde çift tıklayıp Visual Studio’nun metot hazırlaması ve bu metodun içine bir
şeyler yazmasıdır.
*Programcı adayımız veya okurumuz Delegate kavramı
hakkında henüz yeteri bilgiye sahip olmadan .NET Framework ile hazır olarak
gelen bir delegate olan EventHandler’ı
kullanmayı bir güzel öğrenir.
* Başka bir deyişle C# kitabı okuyanlar, C# ve .NET
programcılığını öğrenmek üzere kursa gidenler event anahtar kelimesini hiç kullanmadan deneysel de olsa
programlar yazarlar. Bu şartlarda programcı adayının
için event kavramı diye sorunu henüz yoktur.
* Derken programcının önüne “event” anahtar
kelimesini çıkarırız. Tabi event anahtar kelimesiyle ilgili olarak söylenenler
eski öğrendikleriyle hiç alakalı değildir.
* Bu şartlarda event kavramı C# dilinin en zor
anlaşılan konularından birisi olur çıkar.
26 Ağustos 2017 Cumartesi
Operatörleri Aşırı Yüklemeyle İlgili Notlarım
Konu ister operator overload işlemi olsun ister
indeksleyici hazırlamak olsun, önce kavramsal bilgi vermeye çalışıyoruz. Örneğin
indeksleyicilerden söz etmeden önce dizi değişkenlerin elemanlarına nasıl
erişildiğinden kısaca söz ettik. Bu sayede indeksleyicilerin ne işe yaradığını
bilmeyenlere konunun ezbere anlatılıp okunmasının önüne geçmiş oluyoruz.
Konu hakkında biraz ön bilgi verildikten sonra anlatıma
örnek verilerek yani kod üzerinde devam ediyoruz. Herhangi bir konuyu
anlatırken verdiğimiz örneklerin hem kısa ve kolay hazırlanabilir olmasını hem
de kolay anlaşılmasını gözetiyoruz. Örnek gerekirse, yerli yabancı bir çok
kaynakta operator overload işlemi anlatılırken kompleks sayılarından yararlanma
yoluna gidiliyor. Biz böyle örnek vermeyi tercih etmeyiz, ya okur kompleks
sayıları bilmiyorsa deriz.
20 Ağustos 2017 Pazar
C# 3.0 ve Sonrası İle Gelen Enumerable Sınıfı
Elinizdeki LINQ kaynaklarında burada yapısının bir kısmı ekran görüntüsü olarak verilen Enumerable sınıfı üzerinde ayrıntılı bir şekilde durulmaysa, bilin ki okuduklarınızdan kafanızın karışması ihtimali yüksektir.
19 Ağustos 2017 Cumartesi
Statik Dizi Değişkenler!
Tesadüfen
elime geçen ve bir öğretim üyesi tarafından hazırlanan PDF’de Array sınıfı
tipindeki nesnelerden statik dizi diye söz edildiğini görünce bu kısa
metni yazmak gerekti.
Hoca
arkadaşın demek istediği, klasik şekilde tanımlanan dizi değişkenlerin eleman
sayısının sonradan değiştirilemediğidir. Tabi bunu derken, nesneye yönelik
programlama dillerinin anlamı yıllardır “sabit” olan statik kavramını
kullanıyor.
Madem
konu açıldı biraz konuşalım: İster C#, ister Visual Basic isterse de Java dili
kullanılsın, ArrayList gibi nesne hazırlandığında, nesne dahilinde eleman
sayısı önceden belli olan yani “statik” bir dizi değişken hazırlanır. Bu
ArrayList nesnesine kullanıcı tarafından fazla sayıda eleman eklenip başta
belirtilen sayı aşıldığında geri planda yeni bir dizi değişken tanımlanır ve
artık kapasitesi yeterli gelmeyen eski dizi değişkenin mevcut elemanları yeni
dizi değişkene aktarılır. Bu işlem geri planda otomatik olarak yapıldığı için
fazla meraklı olmayan programcılar ArrayList için dinamik dizi diyebilirler.
Yukarıda
adlarını andığımız programlama dillerinde ArrayList sınıfı olmasaydı programcılar
için gerektiğinde kapasitesi iki katına çıkarılan yeni bir dizi değişkeni
tanımlayıp eski dizi değişkenin elemanlarını yenisine kopyalaması zor değildir.
Tabi hazırda ArrayList veya List sınıfları dururken hiçbir programcı kendini
yorup boş yere kendi koleksiyon sınıfını hazırlamaz.
WindowsFormsApplicationBase Sınıfı
C# projelerinde başlangıç formu olarak kullanılmak istenen
sınıfın örneği Application sınıfının Run() metoduna parametre
olarak verilmektedir. Bu işlem yani projenin başlangıç formunu hazırlama işlemi
Main() metodunun bulunduğu Program.cs dosyasında
yapılmaktadır.
static void Main()
{
Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
Microsoft.VisualBasic.ApplicationServices’deki WindowsFormsApplicationBase
sınıfından yararlanarak C# uygulamasının başlangıç ve açılış formuyla ilgili
bazı işlemleri kolayca yapmak mümkündür. Daha çok Visual Basic programcılarının
kullandığı bu sınıftan C# uygulaması dahilinde yararlanmak istiyorsanız Add
Reference diyalog kutusundan yararlanıp Microsoft.VisualBasic adlı
referansı Solution Explorer penceresinde listelemelisiniz.
Devamında kod satırlarının kısa olmasını sağlamak için using
deyimiyle Microsoft.VisualBasic.ApplicationServices’deki sınıflardan yararlanmak
istediğinizi belirtmeniz önerilir. Bu sınıf hakkında adım adım bilgi verebilmek
için Program.cs dosyasında aşağıdaki gibi WindowsFormsApplicationBase
sınıfının mirasçısı bir sınıf hazırladık.
“App_sinifi” adını verdiğimiz bu sınıf bu hali ile herhangi
bir işleve sahip değildir. Daha önce herhangi bir C# kitabında bu sınıf
hakkında bilgi verilmediği için değişken adı çalmaktan suçlanma ihtimali düşük
olduğu için bu sınıfa argo bir isim vermeye gerek duymadık.
namespace WindowsFormsApplication1
{static class Program
{
static void Main()
{
Application.Run(new Form1());
}
}
public class App_sinifi : WindowsFormsApplicationBase
{
}
}
WindowsFormsApplicationBase sınıfının mirasçısı bu sınıfın
nasıl kullanıldığına örnek olması için ilk olarak OnCreateMainForm()
metodunu override ettik. Bu metodun içinde, projedeki ilk formun yani “Form1” sınıfının
örneğini alıp WindowsFormsApplicationBase tipindeki nesnenin MainForm
özelliğine aktardık.
public class App_sinifi: WindowsFormsApplicationBase
{protected override void OnCreateMainForm()
{
Form1 F1 = new Form1();
this.MainForm = F1;
}
}
Bu şartlarda Main() metodu içinde bu sınıfın
WindowsFormsApplicationBase mirasçısı sınıfının örneği alınıp bu sınıfın Run()
metoduna parametre olarak verilirse “F1” nesnesi uygulamanın başlangıç formu
olur. Aşağıda verilen haliyle Program.cs dosyası ile, Visual Studio tarafından
hazırlanan hali işlev bakımından birbirinden farklı değildir.
using Microsoft.VisualBasic.ApplicationServices;
using System.Windows.Forms;namespace WindowsFormsApplication1
{
static class Program
{
static void Main(string[] parametre)
{
App_sinifi baslangic;
baslangic = new App_sinifi();
baslangic.Run(parametre);
}
}
public class App_sinifi: WindowsFormsApplicationBase
{protected override voidOnCreateMainForm()
{
Form1 F1 = new Form1();
this.MainForm = F1;
}
}
}
Hangi formun uygulamanın başlangıç formu olmasını
istiyorsanız bu formun adını WindowsFormsApplicationBase sınıfının mirasçısı
sınıfın MainForm özelliğine aktarmalısınız. Her ne kadar
WindowsFormsApplicationBase sınıfının mirasçısı bu sınıfı Program.cs dosyası
içinde hazırlamış olsak bile başka bir kod dosyasında kodlayabilirdik.
Başlangıç formu olarak Visual Studio’nun projeye dahil ettiği ilk formu
kullanmak istediğimiz için böyle bir düzenleme yaptık. Bu sınıfın override
edilecek başka metotları ve kendisi için metot hazırlanabilinecek birkaç olayı
olsa bile şimdilik bu kadarıyla yetindik.
Şimdi WindowsFormsApplicationBase sınıfının mirasçısı
sınıftan yararlanıp mevcut bir formu Splash form olarak ekrana
getireceğiz. Bu amaçla üzerinde çalıştığım projeye 2. bir form dahil ettik ve
bu forma “splash_form” adını verdik. Ardından “Program.cs” dosyasındaki
WindowsFormsApplicationBase sınıfının mirasçısı sınıfta OnCreateSplashScreen
metodunu aşağıdaki gibi ezdik(override).
using Microsoft.VisualBasic.ApplicationServices;
namespace WindowsFormsApplication1 {
static class Program
{
static void Main(string[] parametre)
{
App_sinifi baslangic;
baslangic = new App_sinifi();
baslangic.Run(parametre);
}
}
public class App_sinifi: WindowsFormsApplicationBase
{protected override voidOnCreateMainForm()
{
Form1 F1 = new Form1();
this.MainForm = F1;
}
protected override void OnCreateSplashScreen()
{splash_form f_splash = new splash_form();
this.SplashScreen = f_splash;
}
}
}
Bu hazırlıktan sonra proje çalıştırılırsa öncelikle adı WindowsFormsApplicationBase sınıfının
mirasçısı sınıfın SplashScreen özelliğine aktarılan form ekrana
getirilir. Bu form ekranda kısa bir süre durduktan sonra adı MainForm
özelliğine aktarılan form ekrana gelir.
Şimdi ise WindowsFormsApplicationBase sınıfı kaynaklı OnRun()
metodunu override edeceğiz. Bu amaçla yukarıda verilen sınıfı aşağıdaki gibi
düzenledik. Bu şartlarda bu sınıfın örneği alınıp Run() metodu
işletildiğinde önce OnRun, ardından OnCreateMainForm metodu işletilir.
public class App_sinifi: WindowsFormsApplicationBase
{protected override void OnCreateMainForm()
{
Form1 F1 = new Form1();
this.MainForm = F1;
}
protected override void OnCreateSplashScreen()
{
splash_form f_splash = new splash_form();
this.SplashScreen = f_splash;
}
protected override void OnRun()
{
base.OnRun();
}
}
Bu şartlarda OnRun metodunun varlığı ile yokluğu birdir.
Çünkü bu metodun orijinali zaten böyledir. Şimdi konu üzerinde düşünmenizi
sağlamak için bu metoda bir satır ekleyeceğiz.
public class App_sinifi: WindowsFormsApplicationBase
{protected override void OnCreateMainForm()
{
Form1 F1 = new Form1();
this.MainForm = F1;
}
protected
override void OnCreateSplashScreen()
{splash_form f_splash = new splash_form();
this.SplashScreen = f_splash;
}
protected
override void OnRun()
{base.OnRun();
MessageBox.Show("Uygulama çalışmaya başladı");
}
}
OnRun() metodunu bu şekilde değiştirip proje
çalıştırılırsa doğal olarak base.OnRun() satırı sayesinde uygulama
başlatılır. Tabii sıranın MessageBox sınıfının kullanıldığı satıra gelmesi için
uygulamanın çalışmasının sona ermesi gerekir. Tahmin edeceğiniz gibi bu
metottaki “base.OnRun()” satırı silinirse uygulama çalışmaz.
WindowsFormsApplicationBase sınıfı kaynaklı OnRun() metodu
uygulama çalışmaya başladıktan sonra işletilmektedir. Bu sınıfın ayrıca OnStartUp
adında bir metodu var. Kendi hazırladığım sınıfta bu metodu aşağıdaki gibi
Override ettik.
public class App_sinifi: WindowsFormsApplicationBase
{
protected override void OnCreateMainForm(){
{
Form1 F1 = new Form1();
this.MainForm = F1;
}
protected override void OnCreateSplashScreen()
{splash_form f_splash = new splash_form();
this.SplashScreen = f_splash;
}
protected override void OnRun()
{
MessageBox.Show("Uygulama çalışmaya başladı");
base.OnRun();
}
protected override bool OnStartup(StartupEventArgs eventArgs)
{
MessageBox.Show("Uygulama çalışmaya başlayacak");
return base.OnStartup(eventArgs);
}
}
Bu şartlarda uygulama çalıştırılırsa önce OnStartup,
ardından OnRun() metodu işletilir. OnRun() metodundan sonra sıra OnCreateMainForm() metoduna gelir.
OnCreateMainForm metodundan sonra sıra başlangıç formunun Load olayını temsil
eden metoda gelmektedir.
Kaydol:
Kayıtlar (Atom)
