Merhaba. C# yazılım dili ile ilgili yazılarımda, henüz kod yazmaya yeni başlayanlar için açıklamalardan "Merhaba Dünya" yazılımına kadar geldik. Şimdi ise sırada C# yazılım dilindeki değişkenlerden ve fonksiyonlardan bahsetmek var. İleriki yazılarımızda ise gerçek bir stok takip yazılımını birlikte hayata geçireceğiz!:) Ev ödevi olarak hazırlanmış yazılımlardan biri olmayacak. Kodları hazırlayıp derleyip kullanabileceğiniz gerçek bir yazılım olacak. Neyse, konumuza odaklanalım.
Aşağıda verilen kod örneklerini denemek için yeni bir C# Windows Forms Applications projesi oluşturup, karşınıza çıkan "form1" üzerine çift tıklamanız yeterli. Çift tıkladıktan sonra Visual Studio kod görünümüne geçecektir. Kod görünümünde örnek kodları deneyebilirsiniz. Önceki yazılarımda yeni bir proje başlatma adımları anlatıldığı için bu adımı geçiyorum.
Değişken Nedir
Aslına bakarsanız yazılım dünyası, gün geçtikçe gerçek dünyanın bir simülasyonu olmaya daha çok yakınlaşıyor. Yani gerçek dünyada hangi kurallar geçerliyse, doğal olarak yazılımlar da insanlar tarafından oluşturulduğu için, benzer kurallar geçerli. Öğrenciliğiniz sırasında öğretmenlerinizin elma ile armut toplanmaz sözünü sıkça duymuşsunuzdur. Yazılım dillerinde de, elma ile armut toplanamıyor. Farklı görevler için farklı "türlerde" değişkenlere ihtiyacınız oluyor.
Bu farklı türlerdeki değişkenlerden temel değişken olarak adlandırabileceklerimiz, yazılım dili içinde tanımlı. İhtiyaç duyduğunuzda ise kendi değişken türlerinizi tanımlayabileceğiniz altyapı size sunulmakta.
Peki C# yazılım dilinde hangi değişkenler vardır. Önce listesine bakalım. Sonra hepsini ayrıntılı olarak inceleyelim.
Aşağıdaki çizelge, http://www.tutorialspoint.com/csharp/csharp_data_types.htm adresinden alınmıştır. Değişkenlerden yazmayı unuttuğum olmasın diye hazır bir çizelge kullanmayı tercih ediyorum. Ayrıca İngilizce olan içerik Türkçeye çevrilmiştir.
Değişken Türü | Nitelediği Değer | Değer Aralığı | Öntanımlı Değeri |
---|---|---|---|
bool | Mantıksal değişken. | "True" veya "False", Evet veya Hayır, 0 (sıfır) veya 1 (bir). | False, Hayır, 0. |
byte | 8 bitlik işaretsiz tamsayı. | 0 ~ 255 | 0 |
char | 16 bitlik Unicode simge. | U +0000 ~ U +ffff | '\0' |
decimal | 128-bitlik hassas reel sayılar. 28-29 basamak içerebilir. | (-7.9 x 1028 ~ 7.9 x 1028) / 100 ~ 28 | 0.0M |
double | 64 bitlik reel sayı. | (+/-)5.0 x 10-324 ~ (+/-)1.7 x 10308 | 0.0D |
float | 32 bitlik reel sayı. | -3.4 x 1038 ~ + 3.4 x 1038 | 0.0F |
int | 32 bitlik işaretli tamsayı. | -2,147,483,648 ~ 2,147,483,647 | 0 |
long | 64 bitlik işaretli tamsayı. | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0L |
sbyte | 8 bitlik işaretli tamsayı. | -128 ~ 127 | 0 |
short | 16 bitlik işaretli tamsayı. | -32,768 ~ 32,767 | 0 |
uint | 32 bitlik işaretsiz tamsayı. | 0 ~ 4,294,967,295 | 0 |
ulong | 64 bitlik işaretsiz tamsayı. | 0 ~ 18,446,744,073,709,551,615 | 0 |
ushort | 16 bitlik işaretsiz tamsayı. | 0 ~ 65,535 | 0 |
Şimdi yukarıdaki çizelgede size yabancı gelebilecek her şeyi açıklayacağız. İlk satırdan başlayalım ve son satıra kadar gidelim.
* Mantıksal (Boolean) Değişken: Mantıksal değişkenler sadece 1 (Bir) veya 0 (Sıfır) değerlerinden birini alabilirler. Kod yazarken sıkça kullanacağınız değişkenlerin başında gelir. Boolean adı ise bir matematikçinin adından geliyor. Daha önce de bahsettiğimiz gibi, yazılım dünyasındaki neredeyse her şey gerçek dünyada tanımlandıktan sonra yazılımlar içine aktarılabiliyor. Bir matematikçi daha önce mantıksal değişkenleri baz alan matematiksel yaklaşımları matematik dünyasına kazandırmış. Bu tür değişkenler de onun adından esinlenilerek verilen adlarla anılmaya başlamış. Çok uzattım biliyorum bu bilgiye ihtiyacınız olmayacak ama merak edenler için Wikipedia sayfası: https://en.wikipedia.org/wiki/Boolean
Bir de kod içinden örnek verelim. Bir mantıksal değişkeni şu şekilde tanımlarsınız:
Yukarıda yazmış olduğumuz kodları inceleyelim. Öncelikle değişken türünü belirtiyoruz. "bool" yazısı, bir mantıksal değişken tanımlamak üzere olduğumuzu belirtmektedir. Ardından gelen "degiskenAdi" kelimesi ise değişkene verdiğimiz ismi belirtmektedir. Satırın sonundaki ";" simgesi, tanımın veya işlemin tamamlandığını ve başka bir kod parçacığına geçileceğini anlatmaktadır.
Sadece C# yazılım diline özgü olmamakla birlikte, bir türde bir değişken belirttikten sonra değişkenin adını istediğiniz şekilde siz belirlersiniz. Değişken adları belirlerken Türkçe harfleri kullanmamaya özen göstermenizi öneriyorum.
Yazmış olduğumuz ilk satırla birlikte yazılım içinde "degiskenAdi" isimli değişken oluşturuldu. Diğer satırlarda ise bu değişkene değer atıyoruz. İkinci satırda yazmış olduğumuz "degiskenAdi = false;" metni ile, değişkenimize "Hayır/Yanlış/0 (Sıfır)" değerini atamış oluyoruz. Yazının bundan sonraki kısımlarında False değerini 0 (Sıfır) ile ifade edeceğim.
Yazdığımız son satıra baktığımızda ise "degiskenAdi" isimli değişkenimize True (Evet/Doğru/1 (Bir)) değerini atadığımızı görüyoruz. Bundan sonra True değerinden bahsederken 1 (Bir) ifadesini kullanacağım.
Yazmış olduğumuz kodda, alt alta iki satırda, değişkenimizi hiç kullanmadan değişkene iki farklı değer atadık. Aslında son atanan değer, yani 1 değeri geçerli olacağı için, ve arada 0 (Sıfır) değeri hiç kullanılmadığı için atadığımız 0 (Sıfır) değerinin de bir anlamı bulunmamakta. Atanabilecek değerleri örneklemek adına bu şekilde gösterdik.
* Byte Değişken Türü: Bildiğiniz üzere bilgisayar yazılımlarının temeli 1 ve 0 (Sıfır) değerleri üzerine kurulu. Bu 1 ve 0 (Sıfır) değerlerinin sonsuz sayıda uzun ve farklı kombinasyonları sayesinde yazılımlar üretilmekte. Bu bir 1 veya 0 (Sıfır) değerlerinden birini taşıyan en küçük veri parçacığına ise "Bit" denir.
Bir bit değerinin alabileceği farklı değer kombinasyonları sayısını şu şekilde ifade edebiliriz:
1 bitin alabileceği farklı değer adedi = 2¹ = 2 farklı kombinasyon.
Şimdi bir bitlik değerlerin 8 tanesinin yanyana gelerek oluşturduğu bir yapı düşünelim.
8 bitin alabileceği farklı değer adedi = 28 = 256 farklı kombinasyon.
Bilgisayar biliminde, 8 bitin yanyana gelerek oluşturduğu yapıya "Byte" denir. 8 bitin yanyana gelerek oluşturabileceği 256 farklı kombinasyon olduğuna göre, bir Byte içine de 256 farklı değerden biri atanabilir.
Şimdi değişkenler çizelgesindeki Byte türünün karşısındaki 255 değeri anlam kazanmaya başladı. Bir Byte değerine 0 ~ 255 aralığında değer atayabiliyoruz. 0 (Sıfır) da bir kombinasyon olduğu için 256 farklı kombinasyonun sayısal aralıktaki karşılığı 255'e kadar ilerleyebiliyor.
Byte türünden bir değişken tanımlamak ve içine değer atamak için aşağıdaki gibi bir kod yazabiliriz.
Yukarıdaki kodları incelediğimizde, değişkenimizi, mantıksal değişkenler ile aynı yordamla tanımladığımızı görebiliriz. Önce değişken türünü (Byte) sonra da değişkenin adını yazarak tanımımızı tamamlıyoruz.
İkinci satıra baktığımızda ise değişkenimize 128 değerini atadığımızı görüyoruz. Buraya kadar sorun yok. 1 Byte değeri, 256 farklı kombinasyonda değer alabilir ve alabileceği en büyük değer de 255'dir.
Üçüncü satırda ise değişkenimize 257 değerini tanımlıyoruz. Gördüğümüz üzere, Visual Studio, değişkene atadığımız değerin altını kırmızı ile çizerek bizi uyarıyor. Bir byte değerine en fazla 255 değeri atanabildiği için 257 değerinin atanmasına izin vermiyor.
* Char Değişken Türü: Bu konu uzun ve önemli. Dikkatle okumanızı tavsiye ediyorum.
Yukarıda paylaşmış olduğumuz değişkenler çizelgesine baktığımız zaman, sayı, metin ve harf simgelerinin her biri için farklı değişkenler tanımlandığını görüyoruz. C# yazılım dilinde, bir metin veya harf farklı değişken türleri ile ifade edilmektedir. Yani bir metin kaydedecekseniz başka, sadece bir harf kaydedecekseniz başka bir tür değişken kullanmanız gerekmektedir.
Harfleri ve simgeleri tanımlamak için C#'da char değişkeni kullanılmaktadır.
Harfler de, yazılım dillerinde arka planda sayılar ile kodlanmış durumdadır. Yani C#'da bir char değişkenine atamış olduğunuz bir harf arka planda sayılara karşılık gelmektedir. Örneğin "A" harfi, 165 numaralı harftir. Dolayısıyla her harfin bir sayıya karşılık geldiği çizelgeler hazırlanmıştır.
Her harfin bir sayıya karşılık geldiği bu çizelgelerden en bilineni ASCII Character Table'dır. ASCII çizelgesinde 256 adet simge ve harf bulunmaktadır. 256 sayısı size bir yerlerden tanıdık geldi mi? Dikkat ederseniz bir byte 256 farklı kombinasyonda değer alabiliyordu. Öyleyse ASCII çizelgesi hazırlanırken her harfin veya simgenin bilgisayarın hafızasında bir byte kadar yer tutması istenmiş. Yazılımlara ilişkin bu bilgiyi aklınızda tutarsanız, birçok yazılım içinde 256'nın katları kadar olan değişkenlerin kullanılmış olduğunu farkedeceksinizdir. Örneğin Excel yazılımının 2010 öncesi sürümlerinde kullanılabilir en fazla satır sayısı 65536'dır. Bu sayı 256'nın karesidir. Yazılımların tasarımları sırasında, hafıza (RAM) yönetimi ciddi bir konudur ve büyük yazılım projelerinde hassasiyetle ele alınır.
Dünya üzerinde birçok dil bulunmakta ve bu dillerde kullanılan tüm harfleri veya simgeleri 256 adet harf veya simge bulundurabilen (ASCII) bir çizelge içine sığdırmak, takdir edersiniz ki mümkün değil. Bu nedenle, İngilizce harf ve simgeleri yeteri kadar iyi tanımlamış olan bu ASCII çizelgesinin dışında, farklı çizelgeler de tanımlanmıştır. Microsoft Windows işletim sisteminde UTF-16 çizelgesi kullanılır. Bu çizelge, bilgisayarda tanımlanmış olan dile göre harfleri ve simgeleri farklı şekilde sıralayarak kullanıcılara bir harf çizelgesi hazırlar. Daha açık anlatmaya çalışırsak, seçmiş olduğunuz dile göre hazırlanmış olan bir UTF-16 çizelgesi mevcuttur. Bu çizelgelerdeki ilk 256 harf veya simge, ASCII çizelgesindekilerle aynıdır. 256.'dan sonraki harf veya simgeler ise her dil için farklı şekilde sıralanmıştır. Yani "Ö" harfi, Türkçe UTF-16 çizelgesinde X. sırada yer alırken, başka bir dilde Y. sırada yer alabilir. Windows işletim sistemlerinde kullanılan bu UTF-16 çizelgesinin dışında, dünyada yaygın olarak kullanılmakta olan bir standart daha vardır ki, bu standardın adı da UTF-8'dir. UTF-8 standardı, tüm web sitelerinde öntanımlı olarak kullanılması istenen harf ve simge çizelgesi standardıdır.
Dikkat ederseniz blogumda verdiğim bilgileri ayrıntılarıyla birlikte vermeye çalışıyorum ki, hem elimizde her zaman danışabileceğimiz bir kaynak olsun, hem de size araştırmak isteyebileceğiniz konular hakkında bilgi vermiş olayım.
Şimdi tekrar "Char" değişken türüne dönelim. Değişkenler çizelgesine baktığımızda char değişken türünün hafızada 16 bitlik bir yer kapladığını görüyoruz. Yani 2 byte yer kaplamaktadır. Bu da, tanımlı olan her dil için 256 * 256 = 65536 farklı harf veya simge olabileceği anlamına gelmektedir.
Her bir char değişkeni, sadece bir harf tutabilir. Aşağıdaki örnek koda bakalım ve sonra yorumlayalım.
Yukarıdaki kodu incelediğimizde, diğer değişkenleri tanımladığımız yordamla aynı şekilde bir char değişkeni tanımlayabildiğimizi görüyoruz.
İkinci satıra baktığımızda, char değişkenlerine harfleri veya simgeleri iki adet tek tırnak işareti arasında harfi veya simgeyi yazarak atadığımızı görüyoruz. İkinci satırda değişkenimize "G" harfini atadık.
Üçüncü satıra baktığımızda ise, değişkenimizin değerini 1 artırdığımızı görüyoruz? Bu aslında, daha önce bahsetmiş olduğumuz, her harfin veya simgenin arka planda bir sayı ile kodlandığı bilgisini bize hatırlatıyor. Eğer değişkenimizin değerini bir artırırsak ve sonra bu değişkeni parantez içine alıp, önüne de (char) parantezini koyarsak (şekildeki gibi), elde ettiğimiz sayıyı, yazılımın tekrar bir harfe dönüştürmesini sağlarız. Böylece çizelgede bir sonraki harfe veya simgeye atlamış oluruz. Örnekteki durumda, "G" harfinden sonra gelen değeri, değişkenimize atamış durumdayız.
Son satırda ise değişkenimize başka bir harf değeri atıyor ve örneklerimizi tamamlıyoruz.
* Decimal, Double ve Float Değişken Türleri: Bu değişken türleri, reel sayıları tanımlamak için kullanılmaktadır. Değişkenler çizelgesine baktığımızda, bu değişken türlerinin hafızada sırasıyla 128, 64 ve 32 bitlik yer kapladığını görüyoruz.
Ancak Decimal ve Double değişken türlerinin değer aralıklarına baktığımız zaman, Decimal değişken türünün Double değişken türünden daha fazla yere ihtiyaç duyuyor olmasına rağmen, daha dar bir değer aralığında kaldığını görüyoruz.
Double ve float Reel sayı değişkenlerinde, değişkenlere atanan sayılar belli bir kayıpla hafızada tutulur. Çizelgeye baktığımız zaman, float değişken türüne 10^38 sayısını atayabileceğimizi görüyoruz. Ancak float değişkenler, bu sayının yalnızca 7 veya 8 hanesini doğru olarak barındırabilecek şekilde yapılandırılmıştır. Bir float değişkene 1,23456789 reel sayısını atadığımızı düşünelim. Değişkenden değeri tekrar istediğimiz zaman bize 1,234568 reel sayısını verecektir. Dikkat ederseniz sondaki 789 rakamları, virgülden sonraki 6. basamakta yuvarlanmış bir şekilde karşımıza çıkıyor. Float değişkenler ile matematiksel hesaplar (toplama, çıkarma, çarpma vs.) yapıldığında, float değişkenlerin veri kaybı da artmaktadır.
Double değişkenler de float değişkenler ile aynı yapıya sahip olmakla birlikte, 16 veya 17 basamağa kadar hassasiyet taşımaktadır.
Yukarıdaki kodu yazıp (F5'e basarak) çalıştırırsanız, 17 haneli sayınızın, açılan ileti kutusunda sonundaki 1 dikkate alınmadan gösterildiğini görebilirsiniz.
Dolayısıyla float ve double değişkenler büyük reel sayıları barındırabilirler. Ancak virgülden önceki ve sonraki basamaklardaki rakamları 7-8 veya 16-17 haneye kadar hassas bir şekilde kaydedebilirler.
Decimal değişkenler ise 28-29 haneye kadar rakamları barındırabilirler. Bu nedenle sayıların daha hassas bir şekilde kaydedilmeleri mümkündür.
Float, double veya decimal değişken türlerinin hepsinde, değişkenler matematiksel hesaplara sokuldukça veri kaybı yaşanmaktadır. Finansal hesaplarda decimal; fizik ve kimya gibi bilimsel hesaplarda ise double veya float değişkenlerin kullanılması önerilmektedir.
Bu noktadan sonrası çok ciddi bilinmesi gereken bilgiler içermiyor olsa da bir şeyi ifade etmekte fayda var. Bu konuyu daha fazla ayrıntılı anlatabilecek kadar, özellikle de double ve float değişkenlerin hafızada nasıl kaydedildiklerine dair derin bilgilere sahip değilim. Bu nedenle size gerekli kaynağın bağlantı adresini veriyor ve ilgilenenler için kapıyı açarak kaçıyorum:)
https://stackoverflow.com/questions/803225/when-should-i-use-double-instead-of-decimal/803419#803419
Yukarıdaki adresteki anlatımları merak edecek olursanız, satır aralarında verilen diğer kaynaklara yönelen bağlantı adreslerine de tıklamanızı şiddetle öneriyorum (maalesef yabancı dil gerektiriyor).
Short, Integer ve Long Değişken Türleri: Bu değişken türlerinin tamamı tamsayı değerlerini barındırmaktadır. Hafızada kapladıkları yer ise sırasıyla 16, 32 ve 64 bit olarak tanımlanmıştır. Dolayısıyla bu değişkenler, hafızadaki yerlerine göre sırasıyla 2 byte = 256*256, 4 byte = 65536*65536 ve 8 byte = 4294967296*4294967296 farklı kombinasyon tutabilir. Aldıkları değer aralıkları da bu yöndedir.
Şimdi "Short" değişken türünün alabildiği değer aralığı üzerinden bir örnek üzerinde düşünelim. 16 bit yani 2 byte genişliğinde bir yer kapladığına göre 65536 farklı kombinasyonu, short türünde bir değişken içine kaydedebiliriz. Ancak short değişken türünün değer aralığına baktığımıza -32768~32767 yazdığını görüyoruz. Tahmin edebileceğiniz üzere, 0 (Sıfır)'ın altındaki değerler de bir kombinasyon olduğu için, değişkene atanabilecek en büyük değer, tüm kombinasyonların sayısının yarısının bir eksiği olmakta. Bir kombinasyon da hatırlarsınız ki 0 (Sıfır) değeri için harcanıyor. Tamsayı değişken türlerinin, sıfırın altındaki değerleri de taşıdığı zaman aldıkları ön ad "Signed"dır. Yani bu değişken türleri işaretli değişken türleridir.
UShort, UInt ve ULong Değişken Türleri: Bu değişken türleri de ön adlarından da anlaşılabileceği üzere, "Unsigned" yani işaretsiz tamsayıları barındıran değişken türleridir. Dolayısıyla, ushort ve short değişken türlerinin her ikisi de hafızada eşit yer kaplamaktayken, farklı değer aralıklarına sahiptirler. Short değişken türü -32768~32767 değer aralığına sahipken, sıfırdan küçük sayıları barındırmayan ushort değişkeni, 0~65535 değer aralığına sahiptir.
SByte Değişken Türü: Yine tahmin edebileceğiniz üzere, işaretli byte değişken türüdür. Byte değişken türü 0~255 değer aralığına sahipken, sıfırdan küçük sayıları da barındırabilen sByte değişken türü -128~127 değer aralığına sahiptir.
Hatırlatmaya gerek olmadığını biliyorum ancak yine de söyleyim, değer aralığından kastımız, bir değişkene atayabileceğiniz en küçük ve en büyük değerlerin ifadesidir.
Uzun bir yazı oldu, umuyorum ki sıkmadan gerekli bilgileri verebilmişimdir. Diğer yazılarımızda görüşmek üzere.
Hiç yorum yok:
Yorum Gönder