Transcript Document

Visual C#
2
Bellek Kavramı
TAYFUN YİRDEM
Visual C#
2-3 ) C# ile Programlamaya giriş,
Genel bilgi,
Algoritma,
Pseudocode ( sözde kod ) kavramları,
Programlama da bellek kavramını anlamak,
Değişkenler, sabitler,
Veri tipleri,
String, array yapısı. (katar ve dizi yapısına genel bir bakış),
Listeleme yapısı ( Enumeration),
Programlama da matematiksel işlemler( aritmetik ).
Visual C#
Doğrudan .NET Framework için tasarlanmıştır.
Anders Hejlsberg, Scott Wiltamuth, and Peter Golde.
“ # “ işareti C++ ‘ daki iki “ + “ işaretinin birleşimidir.
Microsoft müzikal nota’dan esinlendiğini açıklamıştır.
“See-sharp”
Basit, modern, her yazılımcıya hitap eden, nesneye dayalı
bir programlama dili üretmek amaçlanmıştır.
C ve Assembly ile performans konusunda rekabet etmiyor!!!
Visual C#
.NET Framework’ ü temel alarak çalışır. Diğer tüm diller gibi
Böylece 4000’ den fazla class içerir.
Basit bir syntax’ı vardır. Yani C# dilini anlamak kolaydır.
Oldukça güçlü bir dildir.
Yapmak istediklerinizin fazlasını sunar
Type-Safe
Yazdığınız kodlar bilgisayarınızda sadece izin verilen yerlere
erişebilir.
Bir nesne için geçersiz olan işlemleri ona yaptıramazsınız.
Label’a veri giremezsiniz, o sadece veri okumak içindir.
String değişkeni 2 ile çarpamazsınız.
Object Oriented
Windows Client Uygulamaları  Masaüstü programcılığı
XML Web Servisleri
Web Uygulamaları
Veritabanı Uygulamaları/ Database
Visual C#
90 Keyword
Word dökümanında tüm listeyi görebilirsiniz.
Keyword’ler mavi renktedir. “int, string, using, namespace...”
Curly-brace syntax
C, C++, JAVA vs...”
“ { “  Start
“ } “  End
Tüm değişkenler ve method’ lar bir class içerisinde
tanımlanır
Programlarımızın giriş noktası olan Main method’u da dahil.
Intellisense
Diller arasındaki farklılıklardan biri
Visual C# Express, Visual VB.NET Express farklı olabilir
Visual C#
Algorithma
Bir programın yapması gereken işlevleri
Bu işlevlerin sıraya sokulması
Bu ikisinin oluşturduğu yapıya da algorithma denir.
Kullanıcı tarafından girilen iki sayının toplamını bulan programın
algoritması.
1) Kullanıcıdan birinci sayıyı al
2) Birinci sayıyı bellekte sakla
3) Kullanıcıdan ikinci sayıyı al
4) İkinci sayıyı bellekte sakla
5) Birinci sayı ile ikinci sayıyı topla
6) Sonucu bellekte sakla
Kursun sonuna kadar algoritma kurmaya devam edeceğiz.
Visual C#
Bir C# uygulamasında kullanılması zorunlu olan yapılar???
Program bir yerden başlamak zorunda, Nerden???
Object Oriented olmayan dillerde ilk satırdan başlar,
C# da ise Main method’undan
Main Method’u
Programın başlangıç noktasıdır.
Main method’daki “ { “ programı başlatır.
Main method’daki “ } “ programı bitirir.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class YeniClass
{
static void Main()
{===================== Program çalışmaya buradan
başlar.
}===================== Program çalışmasını burada
bitirir.
Main Method
Bir “class” veya “struct” içerisinde tanımlanmalıdır.
OOP dili olan C# da class veya struct kullanmak zorundasınız.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class YeniClass
{
static void Main()
{
=================== Class tanımlaması
}
}
Struct YeniStruct
{
static void Main()
{
}
}
=================== Struct tanımlaması
Main Method
“static” olarak tanımlanmalıdır.
 “static”, kelime olarak değerini saklayan anlamındadır.
 static üyelere sadece içinde bulundukları class erişebilir. Instance’lar
erişemez. Instance = ?
Nesneleri tekrar tekrar kullanabilmek için onlardan instance
oluşturursunuz yani “örnek”. Object oriented programlama’nın
temeli örnek oluşturmaktır. Sadece 1 tane nesne oluşturulur, ama
onun milyonlarca örneğini kullanabilirsiniz.
Console.WriteLine( )  Console yazmadan WriteLine( ) method’una
erişemezsiniz.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class YeniClass
{
static void Main()
{
}
}
static olarak tanımlanmak zorunda.
Main Method
Return Type’ı olmalıdır.
Yazdığınız programlarda siz method’lardan bir iş görmesini istersiniz.
Eğer, verilen işi yaptıktan sonra method’ların size dönüp cevap
vermesini istiyorsanız “return” keyword’ünü kullanırsınız.
Hayır, sadece işini yapsın bana sonuçları haber vermesin diyorsanız
“void” keyword’ünü kullanmak zorundasınız.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class YeniClass
{
static void Main()
{
return type’ı void
}
}
Void = boş, boşluk, geçersiz, yani, aslında return type yok, Bu
örnekte Main method’u geriye bir değer döndürmüyor.
Main Method
Method işini bitirdikten sonra size sonuçlarla ilgili cevap versin
istiyorsanız return type olarak “int” keyword’ünü kullanırsınız.
Main method’u void değilse sadece integer tipinde değer döndürür.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class YeniClass
{
static int Main()
{
return 1;
}
}
return type’ı int
Main Method
Return type “int” ise return keyword’ü ile değişken de kullanılabilir.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class YeniClass
{
static int Main()
{
return 0;
}
}
return type’ı int
class YeniClass
{
static int Main()
{
int myVariable;
return myVariable;
}
}
return type’ı int tipinde bir değişken
Main Method
Diğer methodların çağrıldığı yerdir.
Yazdığını methodlara erişebilmek için onları main method’u içinde
çağırmak zorundasınız. “Method çağırmayı daha sonra göreceğiz”
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class YeniClass
{
static int Main()
{
YeniMethod();
System.Console.ReadLine();
return 3;
}
static void YeniMethod()
{
System.Console.ReadLine();
}
}
Console Class’ı
Temel Input / Output İşlemleri
Console ekranında herhangi bir bilgi gösterebilmek için
Write( ) ve WriteLine( ) method’ları kullanılır.
System.Console.Write( )  Ekranda istenilen ifadeyi gösterir.
System.Console.Write(“merhaba”);
System.Console.Write(“istanbul”);
Ekranda tek bir satırda
“merhabaistanbul”
System.Console.WriteLine(“merhaba”);
System.Console.WriteLine(“istanbul”);
Ekranda alt alta iki satırda
merhaba
istanbul
Yani Write ile WriteLine method’larının farkı WriteLine method’unda
yazma işleminden sonra cursor bir alt satıra geçmesidir.
Console Class’ı
Write method’u 18 farklı formatta kullanılabilir.
WriteLine merhod’u 19 farklı formatta kullanılabilir.
WriteLine Write method’undan farklı olarak parametre almadan da
kullanılabilen biçimi vardır.
System.Console.Write( );
 Hata üretir
System.Console.WriteLine( );  Ekranda boş bir satır gösterir.
Ekranda sayısal tipte değerler göstermek için
System.Console.WriteLine(951357);
Ekranda string tipinde değerler göstermek için
System.Console.WriteLine(“merhaba istanbul”);
Temel Input / Output İşlemlerinin yanında standard hatalarda Console
ekranında incelenir.
Console Class’ı
Ekranda gösterdiğimiz string tipindeki değerlerin arasında sayısal veya
diğer tipte değerler göstermek için parametreler kullanılır.
{0}
{1}
{2}
...
 Parametre 0, ilk parametre
 Paremetre 1, ikinci parametre
 Paremetre 2, ...
int x=5;
System.Console.WriteLine_
(“x değişkenin değeri={0}, x değişkenin değerinin 3 fazlası={1}“, x, x+3);
Output x değişkenin değeri=5, x değişkenin değerinin 3 fazlası=8
Console Class’ı
int x=5;
System.Console.WriteLine(“x değeri={0,5}tir”, x);
Output
 x değeri=
5tir
{0,5}  Virgülden sonraki sayı kaç karakter boşluk verileceğini gösterir.
Console Class’ı
C4 sayıları para birimi olarak gösterir, 88.8  888.8
D5 sayıları tamsayı olarak gösterir. 88  00088
E sayıları bilimsel formatta gösterir 888.8  8.888000E+002
F3 devirli sayıların ondalıklı kısmını sınırlar  478900  478.900
G Genel formatlama 888.8888  888.8888
N Sayısal format  478123456,900  478,123,456.90
X4 Hexadecimal formatlama  88  0058
Date&Time formating  tarih ve zaman değerlerini formatlamayı daha
sonra ayrıntılı olarak işleyeceğiz.
Console Class’ı
Kullanıcının girdiği değerleri elde edebilmek(yakalayabilmek) için
Read( ) ve ReadLine( ) methodları kullanılır.
System.Console.Read( );
 Girilen tek bir karakter için
System.Console.ReadLine( );
 Girilen ifadenin tamamı için
ReadLine( ) method’u string tipinde değer döndürür.
CommentsAçıklama
//
/* ................
................. */
 Tek bir satırı açıklama olarak kullanmak için.
 Birden fazla satırları açıklama olarak kullanmak için.
Bellek Kavramı
Variable  Değişken
Bu kavram için neden değişken sözcüğü kullanılıyor???
Programcılıkta bellek denince RAM akla gelmelidir.
RAM nedir?
Random Access Memory  Rasgele Bellek Erişimi
Random=Rasgele sözcüğünün kullanılmasının sebebi teyp
kasetlerinin tersine RAM de rasgele istediğiniz bir yere erişip
oraya veri aktarabilmenizdir. Bunun sonucu nedir ?
Kaydetmek istemiyorsunuz sadece geçici olarak saklıyorsunuz.
RAM geçici bellek olarakta adlandırılır. Neden geçici?
RAM’deki bilgiler geçici olarak saklandığından sürekli değişmektedir.
RAM değişken olduğundan, RAM de saklanan her veriye değişken
denir.
Variable = Değişken denmesinin sebebi budur.
Sonuç olarak Bellek Kavramı denince RAM yapısını düşünmelisiniz.
Bellek Kavramı
 Variable  Değişken
 Neden programlarımızda değişken kullanırız.
1) Bilgisayarın belleğinde kendimize geçici olarak bir alan
yaratmak için,
2) Bilgisayarın belleğinde veri saklamak için
Belleğe veri aktarma işlemi
 Write
3) Bilgisayarın belleğinde saklanan verilere erişmek için.
Bellekten veri çekme işlemi
Read
Şekil bellekteki bir bölgeyi ifade ediyor
Bellek Kavramı
 Variable  Değişken
 Peki değişkenlerin değerleri bellekte nasıl saklanır.
 int x;
 X=5;
 Bilgisayarın belleğinde içinde integer tipinde değerler tutabilen ismi
x olan bir bölge tanımladık.
 x değişkenine 5 değerini atadık. Yani bilgisayarın belleğindeki
ayırdığımız bölgede 5 değerini saklıyoruz.
Değişken Kavramı
 C# da Bir değişkeni kullanmadan önce onu tanımlamak
zorundasınız.
 DEĞİŞKEN TANIMLAMAK
 Bir değişken tanımlarken uyulması gereken 3 kural vardır.
1) Her tanımlanan değişkenin tipi belirtilmeli.
 Type
2) Her tanımlanan değişkene bir isim verilmeli.  Label, Name
3) Değişken tipi isminden önce belirtilmeli.
Örnekler:
 int x;
 Değişkenin tipi integer, yani tamsayı.
 Değişkenin ismi x.
 Görüldüğü üzere değişkenin tipini isminden önce belirttik.
 string y;
 Long z;
 Object t; gibi
 Değişken tipleri birer “keyword” olduğundan mavi renktedirler.
Değişken Kavramı
 DEĞİŞKEN TANIMLAMAK
 Değişken tanımlarken Type ve isim belirtmenin de kuralları vardır.
İstediğiniz type veya isim de değişken yaratamazsınız.
 C#.NET de belirli sayıda type vardır.
 C#.NET de her türlü isimlendirme işleminin bir kuralı vardır.
Değişken Kavramı
 Tanımlanan değişkenlerde uygun tipte değer saklanıp saklanmadığını
kontrol eden programlama dilleri “type-safe” programlama dilidir.
 Common Language Runtime içerisinde Common Type System (CTS)
yer alır.
 Build-in(önceden tanımlanmış) değişkenleri yöneten yapı CTS dir.
 Common Type System hem Object-Oriented hem de procedural dilleri
destekler. Bu nedenle object tipinde de basit tiplerde de değişken
yaratabilirsiniz.
 Object-Oriented
 procedural
 Reference Types
 Value types
 Hem Compiler, hem de .NET ortamındaki araçlar CTS’ yi destekler.
 Yani hem design time, hem de runtime da iş görmektedir.
Değişken Kavramı
 TYPES
1) Value Types
 Değer
2) Reference Types
 Referans
3) Pointer Types
 Gösterge
Değişken Kavramı
 VALUE TYPES
 int x = 5;
 Değişken için tahsis edilen bellekte verinin kendisi saklanır.
 Şekildeki gibi, 5 değerini doğrudan bellekte tanımlanan x
değişkeninde tutuyoruz.
Değişken Kavramı
 REFERENCE TYPES
 object y = new object( );
 Değişken için tahsis edilen bellekte verinin adresi saklanır.
 Bellekte tanımlanan y değişkeni object’e giden okun başlangıç
noktasıdır. Yani gerçek değer başka bir yerde saklanır.
 İçerdikleri verinin yolunu gösterirler. Y object’i işaret eder.
 Aynı object’ i işaret edebilirler.
Değişken Kavramı


int x = 5;
int a = x;
object y = new object( );
object b = y;
Değişken Kavramı
 x değişkenin değeri değişirse, a değişkeni bundan etkilenmez.
 x=7;
 Atamasını yapsak bile a değişkeni 5 değerini tutmaya devam eder.
 Reference Type kullanımında ise değişkenler birbirini etkiler.
 y object’in değerini değiştirir ise, bu değişimden b de etkilenir.
Değişken Kavramı
 y = null;
 b = null;
 Bu komutlardan sonra y ve b değişkenleri bellekte herhangi bir yeri
işaret etmezler.
 “null” boş, anlamsız manasındadır.
 DİKKAT!!!, bellekteki object hiçbir değişken tarafından işaret edilmiyor,
yani kullanılmıyor. Bu durumda CLR “Common Language Runtime”
onu çöp sayacak. Bellekte gereksiz bir şekilde yer tutmaması için bir
süre sonra yok edilecektir. Bellekten de atılacaktır.
Değişken Kavramı
 TYPES
1)Value Types
 Değer
2)Reference Types
 Referans
3)Pointer Types
 Gösterge
Pointer daha ileri de ele alınacaktır.
Pointer’ tipi değişkenler de bellekteki başka bir adresi işaret ederler.
Ancak Reference tipindeki değişkenlerle tek ortak yanları budur.
“Gargabe Collector” Çöp toplayıcısı Reference’ları takip ederken
pointer’lerı takip etmez. Siz kendiniz onları temizlemek zorundasınız.
Değişken Kavramı
 Değişkenlerden bahsederken 4 unsur aklımıza gelmeli.
 Her değişkenin bir ismi vardır.
 Bellekte verilerin saklandığı yeri gösterir.
 myInt
myString
myDate
 Her değişkenin bir değeri vardır.
 5
merhaba
12/12/2005
 Her değişkenin sakladığı değerin bir tipi vardır.
 int string
date
 Her değişken tipinin bir kapasitesi vardır. Dolayısıyla o tip de
oluşturulmuş değişkenlerinde bir kapasitesi vardır.
 -2147483648 < integer < 2147483647
 Bu aralığın dışındaki sayıları integer tipindeki bir değişkende
saklayamazsınız.
 integer = Tamsayı
 Maalesef matematikteki kadar değil...
 Bir değişkenin taşıdığı değer değişebilir, ama bir değişkenin ismi, tipi,
kapasitesi asla değişemez.
Bellek Kavramı
•Value Types  Enum ve Struct kullanıcı tarafından tanımlanır.
•Value Types  Diğer value type’lar build-in tipdedir. Yani C# zaten
onları tanımlamıştır.
•Value Types  “null” değerini içeremezler
Değişken Kavramı
 DEĞİŞKENLER SADECE BİR DEĞER SAKLAYABİLİR.
 Boy değişkenine ailenizdeki bireylerin boylarını saklamak
istiyorsunuz.
 Boy = 170  Baba
 Boy = 180  Kardeş, daha önceden babanız için saklamak
istediğiniz 170 değerini kaybedersiniz.
 Değişkenler ile ilgili bir kavram daha ortaya çıkıyor
 “atama” yapmak
Değişken Kavramı
 DEĞİŞKENLERE ATAMA YAPMAK, “DEĞER SAKLAMAK”
 int x;
 x = 5;
 string y;
 y = “merhaba”;
 DateTime d;
 d = 31.12.9999 23:59:59;
Değişken Kavramı
 DEĞİŞKENLERE ATAMA YAPMAK, “DEĞER SAKLAMAK”
 Her değişken tipinin bir kapasitesi vardır.
 Dolayısıyla değişkenler belli bir aralıkta değerler alabilir.
Değişken Kavramı
class YeniClass
{
static void Main(string[] args)
{
System.Console.WriteLine(System.SByte.MaxValue);
System.Console.WriteLine(System.Byte.MaxValue);
System.Console.WriteLine(System.Int16.MaxValue);
System.Console.WriteLine(System.UInt16.MaxValue);
System.Console.WriteLine(System.Int32.MaxValue);
System.Console.WriteLine(System.UInt32.MaxValue);
System.Console.WriteLine(System.Int64.MaxValue);
System.Console.WriteLine(System.UInt64.MaxValue);
System.Console.WriteLine(System.Decimal.MaxValue);
System.Console.WriteLine(System.Single.MaxValue);
System.Console.WriteLine(System.Double.MaxValue);
System.Console.ReadLine();
}
}
Değişken Kavramı
class YeniClass
{
static void Main(string[] args)
{
System.Console.WriteLine(System.SByte.MinValue);
System.Console.WriteLine(System.Byte.MinValue);
System.Console.WriteLine(System.Int16.MinValue);
System.Console.WriteLine(System.UInt16.MinValue);
System.Console.WriteLine(System.Int32.MinValue);
System.Console.WriteLine(System.UInt32.MinValue);
System.Console.WriteLine(System.Int64.MinValue);
System.Console.WriteLine(System.UInt64.MinValue);
System.Console.WriteLine(System.Decimal.MinValue);
System.Console.WriteLine(System.Single.MinValue);
System.Console.WriteLine(System.Double.MinValue);
System.Console.ReadLine();
}
}
Değişken Kavramı
 short Int16
 int
 Int32
 long  Int64
 ulong, uint, ushort
 Unsigned, yani negatif değer almıyor.
Değişken Kavramı
string
byte
ushort
uint
ulong
float
bool
System.String
System.Byte
System.UInt16
System.UInt32
System.UInt64
System.Single
System.Boolean
sbyte System.SByte
short System.Int16
int
System.Int32
long
System.Int64
char
System.Char
double System.Double
decimal System.Decimal
DEĞİŞKENLERİ İFADE EDERKEN İKİSİNDEN BİRİNİ SEÇERSİNİZ.
Keyword’ler (soldakiller) için Takma isim diyebiliriz.
Tek farkları sağ taraftakilerin birer struct olmasıdır.
 Keyword’ler simpel value type’lar için kullanılır.
Değişken Kavramı
class YeniClass
{
static void Main(string[] args)
{
System.Console.WriteLine(System.Byte.MaxValue);
System.Console.WriteLine(System.Byte.MinValue);
System.Console.ReadLine( );
}
}
 Bu programın çıktısı sırasıyla 255 ve 0 olacaktır.
 Byte tipindeki değişkenlerin alabileceği en büyük değer 255 en küçük
değer 0 dır.
 [0,255] aralığının dışındaki değerleri bu tip değişkenlerde
saklayamazsınız.
Değişken Kavramı
class YeniClass
{
static void Main(string[] args)
{
int x;
x = “merhaba”; =========== Bu atama işlemi yapılamaz.
System.Console.WriteLine(x);
System.Console.ReadLine( );
}
}
 Bu program hata üretecektir.
 x değişkeni integer tipinde tanımlanmışsa integer tipinde değerler
tutabilir. Dolayısıyla x değişkenine integer tipinde değerler
atayabilirsiniz.
 Aynı şekilde integer tipinde tanımlanmış x değişkenine “2.5” değerini de
atayamazsınız.
Değişken Kavramı
Bir değişkenin ismini tanımlarken uymanız gereken sadece 2 kural vardır.
1) Keyword kullanamazsınız.
2) Değişken isminin ilk karakteri harf, veya alt çizgi olabilir.
3) İlk karakterden sonra harf, alt çizgi, ve rakam kullanabilirsiniz.
4) Değişken ismi hatası Compile-Time hata üretir
Visual C#
Assembly
Programın “compile” edilmesi sonucu oluşan dosyalar.
“Output of Compiler”
Application
Genellikle “.exe” uzantılı, bir giriş noktası’na sahip olan assembly.
Error
Programın assembly’ye çevrilmesi sırasında oluşur.
Exception
Olağan dışı durum sonucu oluşan hata.
Namespace
Sadece bir gruplama şekli,
Msgbox element’ i System.VisualBasic yerine, System.Elements
namespace’ i içinde de yer alabilirdi. Kolay hatırlanması için...
Program
“Input of Compiler”, assembly olarak çıktısını almak istediğimiz,
yazdığımız kaynak kodlar.
Visual C#
Program.cs  Kaydedilen dosyanın ismi
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(“ilk örneğimiz”);
Console.ReadLine();
}
}
}
Visual C#
Assembly
Programın “compile” edilmesi sonucu oluşan dosyalar.
“Output of Compiler”
Application
Genellikle “.exe” uzantılı, bir giriş noktası’na sahip olan assembly.
Error
Programın assembly’ye çevrilmesi sırasında oluşur.