Son Haberler
Anasayfa / Yazılım / C# / Visual C# Kod Yapısını Anlamak

Visual C# Kod Yapısını Anlamak

Visual Studio 2012 ortamında bir Console Application açtım ve oluşturulmuş hazır kodlar içinde şöyle bir şey yazdım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Deneme
{
    class Program
    {
        static void Main(string[] args)
        {
            //Tek satır yorumum
            Console.WriteLine("İsmail GÜRSOY");
            /*Birden fazla
             * satırda yorum
             * yapmaya görüldüğü üzere
             * devam ettim */
            Console.WriteLine("Merhaba Dünya");
        }
    }
}

Kodlarımızı yazarken kodlarımız arasında bir takım hatırlatıcı, bir takım açıklayıcı yazılar yazmak istediğimiz zamanlar olur. İşte bu yazıları yazabilmek için yorum satırları oluşturmamız gerekir. C#’^ta bir satırın yorum satırı olabilmesi için başında iki adet // karekteri yer alır. Eğer birden fazla bir satırda yorum yapmak istiyorsak /* ile başlar ve */ ile bitiririz.

Görüleceği üzere kodların en üstünde using deyimi ile birlikte bir takım ifadeler kullanılmış. (using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks)

Bu ifadeler kod alanımızda Name space dediğimiz alanda yer alan ifadelerdir. Peki neden varlardır? Uygulamalarımızı oluştururken bir takım kontroller, bir takım yapılar (class, struct v.b. denilen) kullanırız. İşte bunların aslında hepsi .NET ortamında bir class yani bir sınıftan elde edilirler. İşte bunları elde edebilmek içinde namespace alanımızda bunların bulunduğu yeri tanımlamamız gerekir. Bir nevi kütüphane diyebiliriz aslında. .NET Framework kütüphanesi yani. Mesela üstteki örnek için ben Console sınıfını kullanıyorum. İşte bu Console sınıfı .NET Framework içinde System namespace alanındadır. Eğer ben using System; demese idim Console sınıfımı kullanamazdım. Derleyicimde de hata alırdım. .NET Framework kütüphanesi hakkında bilgi almak için aşağıdaki linki inceleyebilirsiniz.

.NET Framework Kütüphanesi

Ayrıca visual studio ortamında herhangi bir namespace üzerine gelip F1 tuşuna basınca da zaten ilgili alan için yardım menüsü açılır. Kodlarımızı yazarken okunabilirliğini arttırmak amacı ile boş satırlar bırakabiliriz. Bu sorun olmaz. Daha sonra kodlarda görüleceği üzere namespace Deneme yazıyor. namespace anlattım zaten, buradaki deneme de benim projeme verdiğim isim. C#’da gerektiği zamanlarda bazen projelerimize, değişkenlerimize, metotlarımıza, kontrollerimize isim veririz. Burada isim verirken bir takım dikkat etmemiz gereken noktalar vardır. Bu isimleri kullanmamız gerekir. Bunlar keywords olarak bilinirler.

2013031431

Birde Contextual Keywords dediklerimiz vardır onlar ise;

2013031432

Genlde kod yazarken net bir kural olmasa da yazılımcıların kabul ettiği bir takım kurallar vardır. Örneğin bir class oluşturulduğunda bunun büyük harfle başlayıp küçük harfle devam etmesi gibi. Birden fazla kelimeden oluşan proje adlarında, metot adlarında, değişken adlarında vb diğer durumlarda Pascal metodu denilen yöntemle isim verilmesi gibi. Örnek olarak aşağıdaki gibi :

DenemeProjesi
IlkUygulama

Sonra yine projelerimize, sınıflara, metotlara, değişkenlere vs herşeye isim verirken Türkçe karakter kullanmayın, vermiş olduğunuz isimlerde rakam olabilir ama rakam ile başlayamaz. Özel karakter kullanmayın. Birtek underscore olarak adlandırılan alt çizgi karakterini (_) kullanabilirsiniz, diğerleri olmaz. Ayrıca boşluk karakeride kullanmayınız. Mesela aşağıdaki isimler uygun.

Ismail1,
Ismail_Gursoy
_Ismail
_Ismail1

gibi.. 123Ismail uygun değildir mesela. Ama A1_Ismail olabilir.

Diğer bir önemli nokta da C# case sensitive özelliğine sahiptir. Yani büyük harf ve küçük harf ayrımı yapar. Dolayısı ile örneğin araba ile ARABA aynı şey değillerdir. Veya A3 ile a3 aynı değildir gibi.

Kod yapımızda bir de parantezler mevcut. Hatta köşeli parantezler diyelim daha doğru olsun. Bu köşeli parantezler sık sık kullanacağımız sık sık göreceğimiz komponentlerdir. Bunlar ile birlikte sınıflar, metotlar, yapılar, kontrollerin eventleri vs hepsi birbirinden ayrılır. Başlangıcı sol köşeli parantez açma {, bitişi sağ köşeli parantez kapama } temsil eder.

Yazılımla eskiden beri uğraşanlar iyi bilirler bu tavsiyem yeniler için bir parantez açtığınız mutlaka onun kapanışını da yapın. Daha sonra içeriğini doldurun bazen binlerce satır kod arasında öyle zamanlar olur ki sırf bir parantez açılıp, kapatılmadığı için hata alırsınız. Gerçi Visual Studio size hatanın sebebini söyler ama tam olarak hangisinin kapatılacağını siz bulmak zorundasınız, dolayısı ile alışkanlık edinin. Açılan parantezi hemen kapatın.

Kodları yazarken de girintili yazmak okunabilirlik açısından ve hata meydana geldiğinde bulunması açısından büyük avantaj sağlar. Eğer kod yapısı bozulmuş bir uygulamanız var ise bu girintiyi sağlamak için Edit > Advanced > Format Document seçiniz.

Her projede main yordamı bulunur, yordam dediğimizi metot olarak da adlandırıyoruz. Eğer main olmaz ise uygulamalar çalışmaz. Görüleceği üzere metodu tanımlayan static void tanımım var. Bunun detayına girmiyorum. Daha sonra uygulamada Console.WriteLine diyerek içeriğinde bir şeyler yazdım. Console.WriteLine ile console’da yazma işlemini aktif ettim. Console uygulaması nedir, buna kısaca değineyim. Console uygulaması sistemimizde Command Prompt alanında uygulamalarımızı çalıştırmamızı sağlar. Eski DOS ekranı ya da bilindik adı ile siyah ekran 🙂 Daha sonra noktalı virgül ; kullanıyoruz. C#’da satırların ardından noktalı virgül kullanılır. Kullanılmayan yerler de vardır onların detayına şimdi girmiyorum.

9 yorum

  1. SORU 1 : BİR DELEGATE TÜRÜ OLUŞTURUP BU TÜRDEN DELEGE NESNESİ OLUŞTURMAK
    //delegate r_type name(params)
    delegate int x(int f,float t);//Delegate,bu türden yaratılan nesneler ref. türündendir.
    class Program
    {
    static void Main(string[] args)
    {
    x x1 = new x(a);//call:invoce:çağırmak
    }
    static int a(int f, float c) {
    return 4;
    }
    }
    }

  2. class Program
    {
    static void Main(string[] args)
    {
    }
    }
    class Node{
    int x;
    static Node base;
    Node rightSide;
    Node leftSide;
    public Node(int x){
    this.x=x;
    if(base==null){
    base=this;
    }else{
    //ekleyecegim nesnenin adresini saklancak değişkenin(yine bir node)
    //nesnesi adresini elde etmeliyiz
    parseTree();

    }
    }
    Node parseTree(){
    Node tmp=base;
    for(;;){//infinity
    if(this.x>base.x){//right
    if(base.rightSide==null)
    base.rightSide=this;
    return;
    }else{
    base=base.rightSide;
    continue;
    }
    }
    else if(this.x<base.x){
    if(base.leftSide==null){
    base.leftSide=this;
    return;
    }else{
    base=base.leftSide;
    continue;
    }
    }else{
    //hiç bişey yapma
    }
    }
    }
    }

  3. İKİ TANE İNTERFACE TANIMLAYIP BUNLARDAN BİR TANESİ METOTA İLİŞKİLENDİRİLİR.
    BİR TANESİ İNT TÜRENDEN İMPLEMENTE EDİLECEK??????????????????????.
    interface Ia {
    void f(int a, byte b);
    }
    interface Ib {
    int P
    {
    get;

    }

    }
    class arg_ :Ia,Ib{
    //Ia void f(int ,byte)
    public void f(int x, byte y) {
    return;

    }
    public int P
    {
    get
    {
    return 1;

    }
    set;
    }

    }

  4. SORU 2 :BİR BAŞK SINIFTAKİ METOTLA İLİŞKİLENDİRİNİZ.
    //delegate r_type name(params)
    delegate int x(int f, float t);//Delegate,bu türden yaratılan nesneler ref. türündendir.
    class Program
    {
    static void Main(string[] args)
    {
    x x1 = new x(prg2.a);//call:invoce:çağırmak
    }
    class prg2
    {
    public static int a(int f, float c)
    {
    return 4;

    }
    SORU 3 : NAMED YAPISINI KULLANARAK 2 METODA SAHİP(MULTICASTING)

    //delegate r_type name(params)
    delegate int x(int f, float t);//Delegate,bu türden yaratılan nesneler ref. türündendir.
    class Program
    {
    static void Main(string[] args)
    {
    x x1 = new x(prg2.a1);//call:invoce:çağırmak
    x1 += new x(prg2.a1);
    }
    class prg2
    {
    public static int a1(int f, float c)
    {
    return 4;

    }
    public static int a2(int f, float c)
    {
    return 4;

    }
    SORU 4: ORTAK METOT DÖNÜŞÜM YAPISI İLE MULTICASTING YAPISINI OLUŞTURMAK
    //delegate r_type name(params)
    delegate int x(int f, float t);//Delegate,bu türden yaratılan nesneler ref. türündendir.
    class Program
    {
    static void Main(string[] args)
    {
    //x x1 = new x(prg2.a1);//call:invoce:çağırmak
    //x1 += new x(prg2.a1);
    //ORTAK METOT DÖNÜŞÜM
    x x1= new x(prg2.a1)+new x(prg2.a2)+new x(( new prg2().a3));

    }
    class prg2
    {
    public static int a1(int f, float c)
    {
    return 4;

    }
    public static int a2(int f, float c)
    {
    return 4;

    }
    public int a3(int f, float c)
    {
    return 4;

    }
    SORU 5 : ANONİM METOTLARI KULLANARAK ??????????????????????????
    delegate int x(int f, float t);//Delegate,bu türden yaratılan nesneler ref. türündendir.
    class Program
    {
    static void Main(string[] args)
    {
    //x x1 = new x(prg2.a1);//call:invoce:çağırmak
    //x1 += new x(prg2.a1);
    //ORTAK METOT DÖNÜŞÜM
    //x x1= new x(prg2.a1)+new x(prg2.a2)+new x(( new prg2().a3));
    x x1;
    x1 =delegate(int a,float b)
    {
    return 1;
    };
    x1 +=delegate(int a,float b)
    {
    return 2;
    };
    x1 +=delegate(int a,float b)
    {
    return 3;
    };

    Console.WriteLine(x1(2, 5. 5f));
    Console.ReadLine();
    SORU 6 :LAMBDA İFADELERİ DEYİMLER
    //delegate r_type name(params)
    delegate int x(int f, float t);//Delegate,bu türden yaratılan nesneler ref. türündendir.
    class Program
    {
    static void Main(string[] args)
    {
    //x x1 = new x(prg2.a1);//call:invoce:çağırmak
    //x1 += new x(prg2.a1);
    //ORTAK METOT DÖNÜŞÜM
    //x x1= new x(prg2.a1)+new x(prg2.a2)+new x(( new prg2().a3));
    x x1;
    x1 =delegate(int a,float b)
    {
    return 1;
    };
    x1 +=delegate(int a,float b)
    {
    return 2;
    };
    x1 +=delegate(int a,float b)
    {
    return 3;
    };
    x1 += (int a,float b) => a + (int)b;

    x1 +=(int a,float b);
    SORU 7:LİNKİNG YAPISI(SINAVDA ÇIKMAZ)
    class lnk {
    private int x;
    private int y;
    //next??
    private static lnk base_;
    private lnk next;
    public lnk() {
    if (base_==null)
    {
    base_=this;
    }
    else
    {
    base_.next = this;
    base_ = this;
    }
    SORU 8: YAPICI METOT İÇERİSİNDEN OLUŞTURULAN NESNENİN REFERANSINA NASIL ULAŞILIR
    static void Main(string[] args)
    {
    lnk ll = new lnk(0);
    }
    }
    class lnk
    {
    private int x;
    private int y;
    //next??
    private static lnk base_;
    private lnk next;
    public lnk(int x)
    {
    this.x = x;
    if (base_ == null)
    {
    base_ = this;
    }
    else
    {
    base_.next = this;
    base_ = this;
    }

    SORU 9: SINIFTA YAŞAYAN KAÇ NESNE TUTULUYOR /STATİC BİR ALAN TANIMLAYIP??
    class arg
    {
    static int count;
    public arg()
    {

    count++;
    }
    ~arg()
    {
    count–;
    }

    }

    }
    SORU 10:İKİ TANE İNTERFACE TANIMLAYIP BUNLARDAN BİR TANESİ METOTA İLİŞKİLENDİRİLİR.
    BİR TANESİ İNT TÜRENDEN İMPLEMENTE EDİLECEK??????????????????????.
    interface Ia {
    void f(int a, byte b);
    }
    interface Ib {
    int P
    {
    get;

    }

    }
    class arg_ :Ia,Ib{
    //Ia void f(int ,byte)
    public void f(int x, byte y) {
    return;

    }
    public int P
    {
    get
    {
    return 1;

    }
    set;
    }

    }

    }

  5. Soru : Binary tree
    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    node n1 = new node(5);
    node n2 = new node(3);
    node n3 = new node(20);
    node n4 = new node(30);
    Console.WriteLine(n1.leftSide.x + “\n”);
    Console.WriteLine(n1.rightSide.x + “\n”);
    Console.WriteLine(n1.rightSide.rightSide.x + “\n”);
    Console.ReadLine();
    }
    }
    class node {
    public int x;
    static node base_;
    public node rightSide;
    public node leftSide;
    public node(int x) {
    this.x = x;
    if (base_==null)
    {
    base_ = this;
    }
    else
    {
    parseTree();
    }
    }
    void parseTree() {
    node tmp = base_; //tmp 1.base,ref bulunur.
    for (; ; ) // sonsuz döngü…
    {
    if (this.x > base_.x)
    {
    if (base_.rightSide == null)
    {
    base_.rightSide = this;
    return;
    }
    else
    {
    base_ = base_.rightSide;
    continue;
    }
    }
    else if (this.x < base_.x)
    {
    if (base_.leftSide == null)
    {
    base_.leftSide = this;
    return;
    }
    else
    {
    base_ = base_.leftSide;
    continue;
    }
    }
    else
    {

    }
    }
    }
    }
    }

  6. Soru: delegate türü oluşturup ve bu türden bir delege nesnesi oluşturunuz.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication1

    {
    delegate int dlg(int x, float b);
    class Program
    {
    static void Main(string[] args)
    {
    dlg d1 = new dlg(a);
    }
    static int a(int f, float c) {
    return 4;
    }
    }
    }

  7. Soru: Anonim methotları
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication1

    {
    delegate int dlg(int x, float b);
    class Program
    {
    static void Main(string[] args)
    {
    dlg d1;
    d1 = delegate(int a, float b) {
    return 1;
    };
    d1 += delegate(int a, float b)
    {
    return 2;
    };
    d1 += delegate(int a, float b)
    {
    return 3;
    };
    Console.WriteLine(d1(1, 5.5f));
    Console.ReadLine();
    }
    }

  8. Lambda ifadesi, deyimleri
    namespace ConsoleApplication1
    {
    delegate int dlg(int x, float b);
    class Program
    {
    static void Main(string[] args)
    {
    dlg d1;
    d1 = delegate(int a, float b) {
    return 1;
    };
    d1 += delegate(int a, float b)
    {
    return 2;
    };
    d1 += delegate(int a, float b)
    {
    return 3;
    };
    d1 += (int a, float b) => a + (int)b; //satır içi metot döndünrmek için kullanılır.

    Console.WriteLine(d1(1, 5.5f));
    Console.ReadLine();
    }

    }

  9. Soru: Bir sınıfta yaşayan nesne
    namespace ConsoleApplication1
    {

    class Program
    {
    static void Main(string[] args)
    {
    }
    }
    class arg {
    static int count;
    public arg() {
    count++;
    }
    ~arg() {
    count–;
    }
    }
    }

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir