C# Değişkenler ve Tür Dönüşümleri

     Merhabalar, ikinci dersimizin konusu daha önce de belirttiğim gibi değişkenler olacak. Bu ders içerisinde: değişken nasıl tanımlanır, tür dönüşümleri nasıl yapılır, const anahtar sözcüğü ne anlama gelir sorularına cevap vermeye çalışacağım. Lafı uzatmadan ikinci derse başlayalım.

DERS 2: Değişkenler

Değişken nedir?

     Değişkenler, programlama dillerinin ve yazılımların olmazsa olmaz yapı taşlarıdırlar. Matematik dersinden de hatırlayacağımız üzere, denklemlerdeki x ve y gibi harfler birer değişkendir. Yani bir sayının yerini tutarlar. Programlamadaki mantık da buna benzerdir. Yazdığımız program boyunca farklı değerlerin saklandığı yerlerdir. Gerçek manada ise; bir programlama dilinde değişken tanımladığımızda, o değişken, bellekteki bir noktayı işaret eder. Örneğin, bir toplama işlemi için firstNumber isminde bir değişken tanımlamışsak, bunun anlamı belleğin (atıyorum) 0x22cc3300 adresine bir isim vermiş gibi oluruz. firstNumber‘ı her kullandığımızda işlemci gidip 0x22cc3300 adresine sahip bellek gözünü okuyacaktır veya oraya yeni değer yazacaktır.

Değişken nasıl tanımlanır?

     C# dilinde değişkenler birkaç farklı şekilde tanımlanabilirler. Değişken tanımlamanın en basit ve hızlı yolu <veri türü> <değişken adi> şeklinde tanımlamaktır. Değişken adı demişken, değişkenlere verilebilecek isimlerden bahsedeyim biraz. Birçok programlama dili, değişken isimlerinde Türkçe karakter kabul etmez. Her ne kadar C#, Türkçe karakterleri kabul ediyor olsa da benim tavsiyem, değişken isimlerinde asla Türkçe karakter kullanmayın ve değişken isimleri olarak a, b, deneme vs. gibi saçma şeyler yazmayın. Hatta eğer İngilizce biliyorsanız, değişken isimlerini mümkün olduğunca İngilizce yazmaya çalışın. Nasıl başlarsanız öyle gider. İleride bir işte çalışmaya başladığınızda sizden büyük ihtimalle İngilizce kod yazmanızı isteyeceklerdir.

     Değişken isimlerinde herkesin kabul ettiği bazı standartlar var. Bunlardan iki tanesini göstereyim: örneğin sınıf mevcudunu tutan bir değişkene studentCount şeklinde bir isim verilebilir veya diğer yönteme göre student_count şeklinde bir tanımlama yapılabilir. Ben ilk yöntemi kullanıyorum; yani ilk kelimenin tamamı küçük, diğer kelimelerin ilk harfleri büyük. Bu sayede kodun okunması kolaylaşmış oluyor. Bir de şu noktaya dikkat edilmesi gerekiyor: her programlama dilinde böyle değildir; ancak C#, değişken isimlerinde büyük/küçük harf ayrımı yapıyor. Yani, student ve Student isimleri farklı değişkenler olarak algılanıyor. Buna dikkat etmenizde fayda var.

     Şimdi birkaç değişken tanımlayalım. Aşağıdaki tanımlamaların tamamı geçerlidir:

int studentCount;
int girls = new int();
float weight;
char firstLetter;
string sentence;
bool isTrue;
bool isWrong= new bool();

     Değişkenleri tanımladık. Peki bu değişkenlere nasıl değer atayacağız? Aslında bir değişken tanımladığımızda, değişkenin veri türüne göre bir ilk değer ataması yapılır. Örnek vermek gerekirse, bir int veya float değişkeni tanımladığınızda, değeri otomatik olarak 0 atanır. Genellikle tüm türler için varsayılan değer 0 (sıfır) dır. Yalnız bool türü için false ve char türü için \0 değerleri atanmaktadır. Aşağıda ise çeşitli değer atamalarını görebilirsiniz:

int studentCount;
studentCount = 25;
int girls = 13;
float weight = 12.3f; //float için sona f veya F konur
double height = 1.68; //f veya F konulmadığında double olur
char firstLetter = 'A'; //tek tırnak kullanılır
string sentence = "Yeni cümle"; //çift tırnak kullanılır
bool isTrue = true;

     Görüldüğü gibi, değişken tanımlamanın ve atamanın farklı yöntemleri var. Yeri gelir birini kullanırsınız, yeri gelir bir diğerini. “Tekini öğrensem yeter.” şeklinde bir düşünce tamamen yanlış olmasa da ileride sıkıntılara yol açabilir.

const anahtar sözcüğü ne anlama gelir?

     Program yazarken bazen sabit değerler kullanmamız gerekebilir. Örneğin pi sayısı için bir değişken oluşturduğunuzu varsayarsak, bu değişkenin değerinin hiçbir zaman değişmemesini istersiniz. Eğer aşağıdaki gibi bir tanımlama yaparsanız, değişkenin değerini yanlışlıkla değiştirmeye çalıştığınızda derleyici hata üretecek ve kodu derlemeyecektir:

const float piNumber = 3.14f;

     const anahtar sözcüğü bu işe yaramaktadır. Burada dikkat edilmesi gereken bir nokta da şudur, const anahtar sözcüğü ile tanımladığınız değişkene değer atarken, atanacak değerin o anda biliniyor olması gerektiğidir. Aşağıdaki kodu incelerseniz ilk tanımlama doğrudur; ancak ikinci tanımlama hataya yol açar:

//ilk tanımlama
const float piNumber = 3.14f;
const float doublePi = piNumber * 2;

//ikinci tanımlama
int truckCount;
const int carCount = 3;
const int totalCount = carCount + truckCount;

     İkinci tanımlamadaki truckCount değişkeni sabit bir değere sahip olmadığından const ataması yapılamamaktadır.

Tür dönüşümü nedir ve nasıl yapılır?

     Tür dönüşümü, bazı matematiksel işlemler yapılırken farklı türdeki iki değişkenin kullanılması sonucu ortaya çıkar. Örneğin döviz ile alakalı bir program yapıyorsunuz ve kur olarak 1.55 double değerini kullandınız. Bu kur değerini bir tam sayı ile çarpmak istediğinizde tür dönüşümü uygulanması gerekmektedir. Çünkü double * int şeklinde bir işlemin sonucunun ne olacağı kestirilemez. Bu aşamada tür dönüşümü yapmanız gerekir. Tür dönüşümleri iki çeşittir: bilinçsiz ve bilinçli tür dönüşümü.

Bilinçsiz tür dönüşümü

     Bilinçsiz tür dönüşümünü sadece küçük türü büyük türe dönüştürürken kullanabiliriz. Yani örneğin 8 bit’lik bir byte değişkenini 32 bit’lik bir int değişkenine bilinçsiz tür dönüşümü ile atayabiliriz. Aşağıdaki kodda gösterildiği gibi yazılır:

byte smallNumber = 2;
int bigNumber = smallNumber;

     Yukarıdaki kod parçasında bigNumber değişkeni 32 bit’tir; ancak smallNumber değişkeni 8 bit’tir. Bu atama sırasında geçici olarak smallNumber değişkeninin başına 24 bit 0 (sıfır) konur ve değeri değişmeden 32 bit olarak bigNumber değişkenine atanır. Atama işleminden sonra smallNumber değişkeni yine 8 bit olarak kalır.

     Tersi bir işlemin yapılması güvenlik sebepleriyle yasaklanmıştır. Yani aşağıdaki kod geçersizdir:

int bigNumber = 2;
byte smallNumber = bigNumber;

     32 bit’lik veriyi 8 bit’lik alana sığdırmak mümkün olmadığından bu dönüşüme izin verilmemiştir; ancak risk almak istiyorsanız veya böyle bir güvenlik riski oluşmayacağından eminseniz bilinçli tür dönüştürmeyi uygulayabilirsiniz.

Bilinçli tür dönüşümü

     Az önce yazmış olduğumuz geçersiz kodu ufak bir değişiklikle geçerli hale getirebiliriz:

int bigNumber = 2;
byte smallNumber = (byte)bigNumber;

     Burada parantez içinde kullanılan veri türü, dönüşümün yapılabilmesini sağlıyor. Şimdi, diyelim ki bilinçli tür dönüşümü yapıyorsunuz; ancak veri kaybı olup olmayacağından da emin değilsiniz. Veri kaybı olacaksa programın hata vermesini istiyorsunuz. Yani diyelim ki bir int değişkeniniz var ve çalışma zamanında 430 değerini almış. Üstteki koddaki gibi bunu bilinçli olarak byte türünde bir değişkene atamak istiyorsunuz. Oysa ki byte 0-255 arasında değer alabiliyordu. Siz 430 değerini atamaya çalışırsanız, 255’ten sonraki değerler için 0’dan başlayacağından, atanacak değer 174 olacaktır. Bir nevi 256’ya göre mod işlemi yapılacaktır. Bunun kontrol edilmesi içinse checked anahtar sözcüğünü kullanıyoruz. Aşağıdaki kod parçasında checked kullanımını ve sonucunu görebilirsiniz:

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

namespace lesson2Example1
{
    class Program
    {
        static void Main(string[] args)
        {
            int bigNumber = 430;
            byte smallNumber;
            checked
            {
                smallNumber = (byte)bigNumber;
            }
            Console.WriteLine(smallNumber);
        }
    }
}

     Yukarıdaki kodu çalıştırdığınızda aşağıdaki gibi bir hata mesajıyla karşılaşacaksınız:

overflow-exception

 

     Bu dersimiz de burada sona eriyor. Sanki biraz uzun oldu ama ikiye bölünce de kısa olacaktı, bölmek istemedim. Bir sonraki derste operatörleri (atama, karşılaştırma vs.) anlatmaya çalışacağım. Eksik veya hatalı gördüğünüz kısımları veya önerilerinizi yorum olarak yazabilirsiniz. Görüşmek üzere…

Bu makaleye 2 yorum yapılmış

  • Serdar

    19 Aralık 2011 at 19:19 Cevapla

    Uzunda bir anlatım olmuş göz mimiklerine sağlık 🙂

  • ozkan

    30 Nisan 2013 at 14:15 Cevapla

    teşekkürler devamını bekliyorum. saygılar

Yorum Yapın

*

warning
www.kemalkefeli.com.tr üzerindeki herhangi bir yazının veya kodun izinsiz olarak başka bir yerde kullanılması yasaktır.