C Sharp Programlama Dili/Visual Studio.NET

Vikikitap, özgür kütüphane
Ders 38. Visual Studio.NET


Şimdiye kadar programlarımızı Not Defteri'nde yazdık ve csc.exe derleyicisi ile derledik. Böyle yapmamızın sebebi C# dilini tam anlamıyla öğrenmemizdi. Artık C# dilini bayağı öğrendik. Artık gelişmiş özelliklerle donatılmış, tümleşik bir derleyiciye sahip olan Visual C# Express Edition yazılımına geçebiliriz. Bu yazılımı buradan ücretsiz olarak indirip bilgisayarınıza kurabilirsiniz.

Yeni bir proje başlatma[değiştir]

Visual C# 2008 Express Edition yazılımının orta kısmı yandaki gibidir. "Recent Projects" kısmından "Create" satırındaki "Project" linkini tıklayarak yeni bir proje oluşturabileceğiniz aşağıdaki ekranı getirin.

Bu penceredeki işimize yarayacak olan proje çeşitleri:
Windows Forms Application Yeni bir Windows uygulaması. Otomatik bir form açılır.
Class Library Yeni bir DLL dosyası.
Console Application Yeni bir konsol (komut istemi) uygulaması.
Empty Project Boş bir sayfa
Diğerleri bizi ilgilendirmiyor. İstediğimiz proje çeşidini tıklayıp OK butonuna bastıktan sonra o tür bir proje için gerekli minimum kodlardan ibaret bir dosya oluşturulacaktır.

Solution Explorer pencereciği[değiştir]

Yeni bir Console Application projesi oluşturun. Sayfanın asıl kısmına kodlarımız otomatik olarak gelecektir. Sayfanın sağ kısmında ise Solution Explorer penceresi bulunur. Solution Explorer pencereciği yandaki gibidir. Bu pencerede kodumuzla ilgili dosyalar ve kodumuza refere ettiğimiz DLL dosyaları bulunur. Referans DLL'leri "References" klasörünün içindedir. Daha önce oluşturduğumuz bir DLL dosyasını programımıza refere etmek için "References" klasörünü sağ tıklayıp "Add Reference"i tıklarız. Açılan pencereden ".NET" sekmesinden .NET Framework'un kendi DLL'lerini, "COM" sekmesinden Windows'un COM bileşenlerini, "Browse" sekmesinden kendi DLL'lerimizi, "Projects" sekmesinden başka projelerin DLL'lerini ve son olarak "Recent" sekmesinden son kullandığımız DLL'leri programımıza refere edebiliriz. Aynı anda birden fazla DLL seçebiliriz.

Class View pencereciği[değiştir]

Menü çubuğundaki "View" menüsünden Class View pencereciğini görünür hâle getirin. Class View pencereciği yandaki gibidir. Class View pencereciğinde o anki projemizdeki ve projemizin referanslarındaki tüm isim alanları, türler ve üye elemanlar hiyerarşik bir yapıda listelenir. Bir türdeki üye elemanları görmek için türü tıklamamız yeterlidir. Türlerde türeme söz konusuysa türeyen üye elemanları da görebiliriz. Projemizde ilgili isim alanı, tür ya da üye elemana gitmek için sadece onun Class View penceresindeki karşılığına çift tıklamak yeterlidir. Türler ve üye elemanlar arasında dolaşmanın diğer bir yoluysa kaynak kodun hemen üstündeki drop down menüleri kullanmaktır.

Kodlama[değiştir]

Kaynak kodda herhangi bir yerde CTRL+boşluk tuş bileşimini kullanırsak orada kullanabileceğimiz her türlü kod (anahtar sözcük, tür, üye eleman, nesne vb.) bir menüde listelenir. Benzer şekilde kodun herhangi bir yerinde bir nesneyi kullanıp . tuşuna basarsanız o nesneyle erişilebilecek üye elemanlar listelenir. Visual Studio.NET'in bunun gibi birçok özelliği vardır. Bunları kendiniz program yazdıkça keşfedebilirsiniz.

Visual Studio.NET ve dosyalar[değiştir]

Visual Studio projelerimizi varsayılan olarak "C:\Documents and Settings\Kullanıcı\Belgelerim\Visual Studio 2008\Projects" klasörüne kaydeder. (Derleme ve kaydetmenin nasıl yapıldığını ileride ayrıntılarıyla anlatacağım. Şimdilik programın kapatma düğmesine basıp gelen uyarı penceresine "Yes" deyin.) Bu klasörde solution ismimiz, bu klasörün içinde proje klasörümüz/klasörlerimiz, proje klasörümüzün içinde ismi sınıf ismimizle aynı olan kaynak kod dosyamız, bu klasördeki bin klasörünün içindeki Debug klasöründe de exe dosyamız bulunur. Yani son tahlilde exe dosyamızın yolu C:\Documents and Settings\Kullanıcı\Belgelerim\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug şeklindedir. Projemize kaynak kod dosyası eklemek için Solution Explorer pencereciğinde projeyi sağ tıklayıp Add -> New Item yolunu izleyin. Açılan pencereden yeni oluşturulacak dosyadaki bildirimleri otomatik yapabilirsiniz. Örneğin bu açılan pencereden Code File'ı seçerseniz boş bir cs dosyası projemize eklenir, eğer Class'ı seçerseniz içinde bir sınıf bildirimi olan bir cs dosyası projemize eklenir. Yine Solution Explorer penceresindeki kaynak kodları sağ tıklayıp silebilir, projeden çıkarabilir, projeyi sağ tıklayıp Add -> Existing Item yolunu izleyerek var olan bir kaynak kodu projemize ekleyebiliriz. Ayrıca projeye sağ tıklayıp Add -> New Folder yolundan kaynak kodlarımızı koordine etmek için projemize bir klasör de ekleyebiliriz.

Solution kavramı[değiştir]

Solution, projeleri koordine etmeye yarayan bir yapıdır. Bir projede yalnızca bir tane çalıştırılabilir (exe) dosya bulunur. Bir solution'da ise birden fazla çalıştırılabilir dosya bulunabilir. Bir solution'a proje eklemek için Solution Explorer pencereciğinde solution sağ tıklanıp Add -> New Project yolu kullanılır. Aktif solution'a proje eklemenin başka bir yolu ise File menüsünden "New Project"i seçmektir. Bir projeyi başlangıç projesi yapmak için ilgili proje sağ tıklanıp "Set as StartUp Project" seçilir. Başlangıç projesinin ne demek olduğunu ileride göreceğiz.

Derleme[değiştir]

Visual Studio.Net başlangıç projesindeki bütün kaynak kod dosyalarının birleştirilip derlenmesi için iki yol sunar. Bunlar Debug ve Release seçenekleridir. Debug seçeneği programımızın çalışmasını test etmek ve hata ayıklamak için kullanılır. Release seçeneği ise programımızın testi bittiğinde son kullanıcının istifadesine sunmak için kullanılır. Release seçeneğinde kodumuzdan bütün gereksiz kısımlar atılır ve program daha hızlı çalışır. Debug seçeneğinde ise hata ayıklama için gerekli kodlar kaynak kodumuza gizlice eklenir.

Başlangıç projesini debuglı çalıştırmak için debug menüsünden "Start Debugging" seçilir. Projeyi debugsız çalıştırmak içinse yine aynı menüden "Start Without Debugging" seçilir. Bunların kısayolları sırasıyla F5 ve Ctrl+F5'tir.
NOT: İlk aşamada solution, araç çubuğundaki disket simgesine ya da File menüsündeki Save komutuna tıklanmadan sabit diske kaydedilmez.

Hata ayıklama[değiştir]

Hata ayıklama kaynak kodumuzun çeşitli yerlerine yerleştirdiğimiz breakpointlerle yapılır. Debuglı çalıştırılan bir kod breakpoint olan satırlardan birine geldiğinde programın çalışması duraklatılır (pause). Kaynak koddaki bir satıra breakpoint koymak için ilgili satır sağ tıklanıp Breakpoint -> Insert Breakpoint yolu izlenir. Bir satıra breakpoint koymanın başka bir yolu ise imleç ilgili satırdayken F9 tuşuna basmaktır. Kod debuglı çalışırken breakpointli bir satıra gelindiğinde Debug menüsünün içeriği değişir. Bu menüdeki önemli seçenekleri inceleyecek olursak; "Step Over" programın işleyişini bir sonraki satıra götürür. "Continue" ile bir sonraki breakpointe kadar programın işleyişi devam ettirilir. "Stop Debugging" ile de hata ayıklama modundan çıkılır. Windows -> Watch yolundan değişken değerlerini adım adım izleyebileceğimiz Watch pencereciği görünür hâle getirilir. Watch pencereciğine bir değişken izlemesi eklemek için pencere sağ tıklanır ve "Add Watch" seçilir. Bu adımdan sonra boş satırın "Name" sütunu çift tıklanır ve buraya değişken ya da değişkenlerden oluşan bir ifade yazılır. Artık ilgili satırın "Value" sütununda ilgili satırdaki değişken ya da ifadenin değeri adım adım gösterilecektir. Yine Debug menüsündeki "Exceptions" seçeneği ile bir istisnai durum fırlatıldığında ya da fırlatılıp yakalanamadığında debugın devam etmesini ya da durmasını sağlayabilirsiniz.
NOT: Bir solutionın tamamını derleyip release olarak kaydetmek için "Build" menüsünden "Build Solution" seçilir.

Visual Studio.NET ile form tabanlı çalışma[değiştir]

Geçen bölümde kodlarla bir form oluşturmuş, formun üzerine bir buton getirmiş ve butona tıklandığında bir ileti kutusunun açılmasını sağlamıştık. Bu bölümde diğer kontrolleri Visual Studio.Net ile formumuza getirip ayarlamalarını Visual Studio.Net ile yapacağız. Öncelikle Visual Studio.Net'te bir Windows Forms Application projesi oluşturun. Ekranınıza yandaki gibi boş bir form gelecektir. Formun yanındaki toolbox'tan forma bir buton ve bir de textbox sürükleyin. Alternatif olarak bunları forma getirmek için çift tıklamanız da yeterlidir. Kontrollerin yandaki tutamaçlarıyla oynayarak boyutlarına değiştirebilir veya sürükleyerek formdaki istediğiniz bir noktaya taşıyabilirsiniz. Tabii bunları yaparken kaynak kodumuz otomatik olarak değişecektir.

Seçili kontrolün özelliklerini görebileceğiniz "Properties" penceresini görünür hâle getirmek için View menüsünden "Properties Window"u seçin. Properties penceresinden (yandaki resimde) seçili kontrolün özelliklerini değiştirebileceğiniz gibi aktif kontrolü değiştirmek için Properties penceresinin üst kısmındaki dropdown menüyü de kullanabilirsiniz. Bir kontrolün olaylarını listelemek için Properties pencereciğinin üst kısmındaki sarı yıldırım simgesini tıklayabilirsiniz. Listelenen olayların sağdaki boş kısmına bir metot adı yazarak bu olay gerçekleştiğinde bu metodun çalışmasını sağlayabiriz. Siz buton seçiliyken Click olayını seçin ve metot ismi bölümüne Tiklandi yazın. Sonra bu metot ismine çift tıklayın. Metodun içeriğinin yazılacağı bir ekran açılacaktır. Metodun içeriğine şu satırı yazın:

 MessageBox.Show("Merhaba");

Şimdi Solution Explorer penceresine bakacak olursak Form1.cs ve Program.cs olmak üzere iki öge vardır. Program.cs, içinde Main() metodunun ve Program sınıfının olduğu asıl dosyamızdır. Form1.cs'nin yanındaki + işaretine tıklayacak olursak Form1.Designer.cs ve Form1.resx olmak üzere iki dosya vardır. Form1.resx bizi ilgilendirmiyor. Form1.Designer.cs formdaki kontrolerin görsellikleriyle ilgilenen dosyadır ve biz formdaki kontrollerde değişiklik yaptıkça bu dosyanın içeriği değişir. Öncelikle Form1.Designer.cs'nin içeriğine bakalım:

 namespace DenemeForm
 {
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        
        #region Windows Form Designer generated code
        
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(105, 53);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.Tiklandi);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(79, 94);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(129, 20);
            this.textBox1.TabIndex = 1;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();
            
        }
        
        #endregion
        
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
    }
 }

Eğer sizde bu kod çok daha kısaysa region'dan dolayıdır. Kodun sol kenar kısmında bir region olduğunu belirten herhangi bir + işareti olmadığına emin olun. Kodumuzu inceleyecek olursak:

  • Form sınıfının en altında iki özelliği var. Bunlar forma eklediğimiz kontrolleri temsil eden Button tipinden olan button1 ve TextBox tipinden olan textBox1. Bu kaynak koddaki önemli metotları inceleyecek olursak;

SuspendLayout() Form sınıfına aittir. İlgili form nesnesine ait bütün özellikler değiştirildiğinde form otomatik olarak çizilir.
ResumeLayout() Form sınıfına aittir. SuspendLayout() metodundan sonra kullanılır. Bu metot kullanıldığında son SuspendLayout() metodundan sonraki ilgili form nesnesine yapılan değişiklikler görsel forma yansıtılır.
ClientSize() Formun boyutu. System.Drawing.Size tipinde.
Kaynak kodumuzda Dispose() metodu override edilmiş. Yani bu sınıf türünden bir nesnenin Dispose() metodunu kullanırsak sistemin bu nesne için ayırdığı kaynaklar iade edilecek. Şimdi Program.cs dosyasının içeriğine bakalım:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Windows.Forms;
 
 namespace DenemeForm
 {
     static class Program
     {
         /// <summary>
         /// The main entry point for the application.
         /// </summary>
         [STAThread]
         static void Main()
         {
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
             Application.Run(new Form1());
         }
     }
 }

Bizi burada tek ilgilendiren kısım Application.Run(new Form1()); satırı. Bunu daha önce görmüştük zaten. Şimdi kaynak kod dosyalarının üstündeki banttan Form1.cs dosyasına bakalım. Programcının en çok haşır neşir olduğu dosya budur. Şimdi de bunun içeriğine bakalım:

 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 DenemeForm
 {
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
         }
         
         private void Tiklandi(object sender, EventArgs e)
         {
             MessageBox.Show("Merhaba");
         }
     }
 }

Burası bizim butonun Click olayına ekledimiz metodun bulunduğu dosya. Ayrıca Form1.Designer.cs ile bu dosyanın sınıf isimleri aynı ve partial. Tabii ki bu durumda anlıyoruz ki iki dosyadaki üye elemanlar da aslında aynı sınıfta. Burada Form1 sınıfının yapıcı metodu bulunuyor. Bu yapıcı metotta Form1.Designer.cs'deki InitializeComponent() metodu çağrılmış.

Birden fazla formla çalışmak[değiştir]

Visual Studio.NET ile birden fazla formla çalışmak son derece basittir. Bunun için Solution Explorer penceresinde ilgili proje sağ tıklanıp Add -> Windows Form yolu izlenir. Her form için farklı sınıflar ve cs dosyaları oluşturulur. Buradaki kritik nokta bir formdan başka bir formun kontrollerine erişebilmek için ilgili kontrolü temsil eden özelliğin public olarak bildirilmesi gerekliliğidir. Bir projede birden fazla form olabilir. Bir formu göstermek için Show() metodu kullanılabilir. Program.cs dosyasında Main() metodunda hangi Form nesnesi çağrılıyorsa o form program çalıştığında önce gösterilecektir.

Önemli diğer kontroller[değiştir]

MessageBox[değiştir]

En önemli metodu Show()'dur ve ileti gösterir. Show() metodunun prototipi şu şekildedir;

 DialogResult Show(string ileti,string başlık,MessageBoxButtons a,MessageBoxIcon i)

MessageBoxButtons enumu ileti kutusundaki butonların durumlarını belirtmemizi sağlayan bir enumdur. Bu enumun içerdiği sözcükler şunlardır:

  • AbortRetryIgnore → İleti kutusunda "Durdur", "Yeniden Dene" ve "Yoksay" butonları olur.
  • OK → İleti kutusunda yalnızca "Tamam" butonu olur.
  • OKCancel → İleti kutusunda "Tamam" ve "İptal" butonları olur.
  • RetryCancel → İleti kutusunda "Yeniden Dene" ve "İptal" butonları olur.
  • YesNo → İleti kutusunda "Evet" ve "Hayır" butonları olur.
  • YesNoCancel → İleti kutusunda "Evet", "Hayır" ve "İptal" butonları olur.

MessageBoxIcon enumundaki sözcüklerse şunlardır: Asterisk, Error, Exclamation, Hand, Information, None, Question, Stop, Warning. Bunlar ileti kutusunda görünen simgeyi belirtmemizi sağlar.

Show() metodunun geri dönüş tipi DialogResult enumudur. Bu enumun içerdiği sözcüklerse şunlardır: Abort, Cancel, Ignore, No, Yes, None ve Retry. İsterseniz bununla ilgili birkaç satırlık bir örnek yapalım:

 DialogResult dr=MessageBox.Show("Merhaba","Başlık",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
 if(dr==DialogResult.Yes)
    MessageBox.Show("Evete bastınız.");
 else
    MessageBox.Show("Hayıra bastınız.");

Menüler[değiştir]

MainMenu[değiştir]

Bir formun üstüne ana menü getirmek için toolbox'tan bir MainMenu kontrolü getirilir. Eğer toolboxınızda MainMenu kontrolü yoksa ilgili kontrolü getirmek için toolbox'ta herhangi bir kontrolü sağ tıklayıp "Choose Items"ı seçin. Ana menü demek programların başlık çubuğunun hemen altındaki "Dosya", "Düzen", "Görünüm", ... diye giden çubuktur. Her bir menü elemanının ayrı ayrı Click olayı vardır. Menü elemanlarına kısayol tuşu vermek için istediğimiz karakterden önce & karakterini kullanırız. Bu durumda alt tuşu ile birlikte o karakterin tuşuna basarsak ilgili menü açılacaktır. Menüye öge, seçenek ve seçeneklere ek seçenek ekleme için "Type Here" yazan yere yazılar yazılır. Menüde herhangi bir yere ayırıcı koymak için ilgili yer sağ tıklanıp "Add Separator" seçilir.

ContextMenu[değiştir]

ContextMenu formdaki herhangi bir elemana ya da formun kendisine sağ tıklandığında çıkan menüdür. Kullanımı büyük ölçüde MainMenu ile aynıdır. Ancak ContextMenu'nün bir kontrole ilişkilendirilmesi gerekir. Bu ContextMenu'yü herhangi bir kontrolle ilişkilendirmek için önce ContextMenu oluşturulur, sonra ilişkilendirilmesi istenen kontrol tıklanıp "Properties" penceresindeki özelliklerinden ContextMenu özelliğini bu tasarlamış olduğumuz ContextMenu olarak ayarlamamız gerekir.

ListBox[değiştir]

ListBox kantrolü bir dizi yazıyı tutmak için kullanılabilir. ListBox sınıfının Items özelliğinin tipi bir koleksiyondur. Bu koleksiyona eleman ekledikçe listboxtaki elemanlar artacak, eleman çıkardıkça listboxtaki elemanlar eksilecektir. Şimdi forma bir ListBox kontrolü getirip şu örnek kodları yazın:

 listBox1.Items.Add(1.2f);
 listBox1.Items.Clear();
 listBox1.Items.Add(5);
 listBox1.Items.Add("deneme");
 listBox1.Items.Remove(5);
 MessageBox.Show(listBox1.Items.Count.ToString());
 MessageBox.Show(listBox1.Items.IndexOf("deneme").ToString());

Gördüğünüz gibi Add() metodu object tipinden parametre alır.

Diyalog pencereleri[değiştir]

.NET Framework'taki hazır diyalog pencereleri normalde çok karmaşık olan birçok kontrolü hazır olarak bize sunar. Şimdi toolboxtaki hazır diyalog penceresi kontrollerini inceleyelim:

  • OpenFileDialog → Dosya açma ekranını temsil eder. Dosya bilgisini getirir.
  • SaveFileDialog → Dosya kaydetme ekranını temsil eder. Yol bilgisi elde etme amaçlı kullanılır.
  • FontDialog → Font (yazı tipi) seçme penceresini temsil eder.
  • ColorDialog → Renk seçme penceresini temsil eder.
  • PrintDialog → Yazdırma ekranını temsil eder.
  • PrintPreviewDialog → Baskı önizleme penceresini temsil eder.
  • PageSetupDialog → Sayfa Yapısı penceresini temsil eder. Şimdi OpenFileDialog ile ilgili küçük bir örnek yapalım:
 OpenFileDialog ofd = new OpenFileDialog();
 DialogResult dr = ofd.ShowDialog();
 string dosya = ofd.FileName;
 if(dr!=DialogResult.Cancel)
    MessageBox.Show(dosya + " dosyasını seçtiniz.");

Label[değiştir]

Label kontrolü formun üzerine bir yazı getirmek için kullanılır. En önemli özelliği Text'tir ve bu yazıyı temsil eder.

Timer[değiştir]

Timer kontrolü ile bir ya da daha fazla metodun defalarca çalıştırılmasını sağlarız. Timer kontrolünün Interval özelliği kaç milisaniyede bir ilişkili metotların çalıştırılacağını belirtmemizi sağlar. 1 saniye 1000 milisaniyedir. Timer kontrolü varsayılan olarak aktif değildir. Timerın aktif-pasifliğini değiştirmek için bool tipinden olan Enabled özelliği kullanılır. Timer sınıfının en önemli olayı Tick'tir. Tick olayı her Interval ile belirtilen zamanda bir gerçekleşir. Şimdi çok küçük bir örnek yapalım:

 //button1'in Click olayına
 timer1.Enabled = true;
 timer1.Interval = 1000;
 //timer1'in Tick olayına
 label1.Text = DateTime.Now.ToLongTimeString();

Burada her 1000 milisaniye (1 saniye) geçişte label1'in Text'i şu anki saat olarak değiştirilecektir.
NOT: Her kontrole çift tıkladığımızda açılan metot, ilgili kontrolün en çok kullanılan olayına bağlanan metottur.

Bu kitabın diğer sayfaları
  • Sınıflar
  • Operatör aşırı yükleme
  • İndeksleyiciler
  • Yapılar
  • Enum sabitleri
  • İsim alanları
  • System isim alanı
  • Temel I/O işlemleri
  • Temel string işlemleri
  • Kalıtım
  • Arayüzler
  • Partial (kısmi) tipler
  • İstisnai durum yakalama mekanizması
  • Temsilciler
  • Olaylar
  • Önişlemci komutları
  • Göstericiler
  • Assembly kavramı
  • Yansıma
  • Nitelikler
  • Örnekler
  • Şablon tipler
  • Koleksiyonlar
  • yield
  • Veri tabanı işlemleri
  • XML işlemleri
  • Form tabanlı uygulamalar
  • Visual Studio.NET
  • Çok kanallı uygulamalar
  • ASP.NET