BĠLĠġĠM TEKNOLOJĠLERĠ



Benzer belgeler
ĠNġAAT TEKNOLOJĠSĠ PVC KEPENK

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI MATBAA TEKNOLOJĠSĠ TAMPON BASKI SORUNLARI 213GIM261

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 3. Bölüm Veri Tipleri ve Değişkenler

AYAKKABI VE SARACĠYE TEKNOLOJĠSĠ

T.C. MİLLÎ EĞİTİM BAKANLIĞI GEMİ YAPIMI BAŞ BLOK RESMİ 521MMI400

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ

BİLİŞİM TEKNOLOJİLERİ

AYAKKABI VE SARACĠYE TEKNOLOJĠSĠ

Program AkıĢ Kontrol Yapıları

ORTOPEDĠK PROTEZ VE ORTEZ

BĠLĠġĠM TEKNOLOJĠLERĠ

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI TEKSTĠL TEKNOLOJĠSĠ DÜZ ÖRME KOL DĠKĠMĠ 542TGD677

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI. ĠNġAAT TEKNOLOJĠSĠ PVC PENCERE VE KAPI DETAYLARI ÇĠZĠM 582YIM066

Programlama Dilleri 3

Programlama Dilleri III 1

C#(Sharp) Programlama Dili

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ CNC ABKANTTA BÜKME 521MMI254

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI. ĠNġAAT TEKNOLOJĠSĠ ÖLÇEK VE ÖLÇÜ BĠRĠMĠ HESAPLARI

NESNEYE YÖNELİK PROGRAMLAMA

ÖĞRENME FAALĠYETĠ 10 ÖĞRENME FAALĠYETĠ 10 AMAÇ

EL SANATLARI TEKNOLOJİSİ

Fortran komut satırı toplam 80 kolon ve 5 bölgeden oluģur. Komut satırının yapısı aģağıdaki gibidir:

BİLİŞİM TEKNOLOJİLERİ

Pointer Kavramı. Veri Yapıları

BİLİŞİM TEKNOLOJİLERİ

PAZARLAMA VE PERAKENDE

BĠLĠġĠM TEKNOLOJĠLERĠ

BĠYOMEDĠKAL CĠHAZ TEKNOLOJĠLERĠ TEKNĠK ORGANĠZASYON VE KAYIT

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ BOĞMA-BURMA 521MMI048

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI MOBĠLYA VE ĠÇ MEKÂN TASARIMI GRUP MOBĠLYA-1 543M00051

HSancak Nesne Tabanlı Programlama I Ders Notları

EL SANATLARI TEKNOLOJĠSĠ

RAYLI SĠSTEMLER TEKNOLOJĠSĠ

Göstericiler (Pointers)

1 C#.NET GELİŞTİRME ORTAMI 1 Visual Studio 2015 Arayüzü 4 Menu Window 6 Solution Explorer 7 Properties Window 8 Server Explorer 8 Toolbox 9

SAĞLIK HĠZMETLERĠ SEKRETERLĠĞĠ

T.C. MİLLÎ EĞİTİM BAKANLIĞI TEKSTİL TEKNOLOJİSİ BASKI KOMBİNASYONLARI 1

T.C. MİLLÎ EĞİTİM BAKANLIĞI TEKSTİL TEKNOLOJİSİ DÜZ ÖRME KADIN PANTOLON KALIPLARI 542TGD518

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ SAC BORULAR 521MMI250

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Diziler İndisli Değişkenler

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI TEKSTĠL TEKNOLOJĠSĠ DÜZ ÖRME ELBĠSE DĠKĠMĠ 542TGD540

YZM 2105 Nesneye Yönelik Programlama

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ. OKSĠ-GAZ ĠLE KÖġE KAYNAĞI 521MMI051

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ. YATAYDA KÖġE KAYNAĞI 521MMI056

Bir hafıza hücresinin adres bilgisini tutmaya yarayan değiģkenlere iģaretçi adı verilir. ĠĢaretçiler aģağıdaki gibi tanımlanırlar.

Veri Tipleri Aşağıdaki programdaki 5 hatayı bulunuz.

ELSANATLARI TEKNOLOJİSİ

Özyineleme (Recursion)

2.2- DEĞİŞKENLER VE SABİTLER ÇALIŞMA YAPRAĞI

Operator Aşırı Yükleme (Operator OverLoading)

ÖĞRENME FAALĠYETĠ 2 ÖĞRENME FAALĠYETĠ-2

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI MAKĠNE TEKNOLOJĠSĠ. CNC FREZE ĠġLEMLERĠ 2 521MMI131

Yrd. Doç. Dr. Caner ÖZCAN

KONAKLAMA VE SEYAHAT HĠZMETLERĠ

C Programlama Dilininin Basit Yapıları

HSancak Nesne Tabanlı Programlama I Ders Notları

Sunum İçeriği. Programlamaya Giriş

T.C. MİLLÎ EĞİTİM BAKANLIĞI TEKSTİL TEKNOLOJİSİ ÇORAPTA FORM 542TGD503

MOBĠLYA VE ĠÇ MEKÂN TASARIMI

ÖĞRENME FAALĠYETĠ 3 ÖĞRENME FAALĠYETĠ 3

Yrd. Doç. Dr. Caner ÖZCAN

T.C. MİLLÎ EĞİTİM BAKANLIĞI TEKSTİL TEKNOLOJİSİ KORD ÖRGÜLER 542TGD706

ELN1001 BİLGİSAYAR PROGRAMLAMA I

Program akıģı sırasında belirtilen satır numaralı yere gitmek için kullanılır. Genel formu: [<satır numarası>] GOTO <satır numarası 1> GOTO n

ALGORİTMA VE PROGRAMLAMA II

BİLİŞİM TEKNOLOJİLERİ

BĠLĠġĠM TEKNOLOJĠLERĠ

BİLİŞİM TEKNOLOJİLERİ

ELEKTRĠK-ELEKTRONĠK TEKNOLOJĠSĠ

Bu modül, Makine Halıcılığı sektöründe hazırlanmış olan sertifika/kurs müfredat programlarındaki yeterlikleri kazandırmayı amaçlayan bireysel öğrenme

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Nesne Tabanlı Programlama Dersi Edirne Kız Teknik ve Meslek Lisesi

GĠYĠM ÜRETĠM TEKNOLOJĠSĠ

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ. OKSĠ GAZ ĠLE KORNĠġ VE TAVAN KAYNAKLARI 521MMI202

Genel Programlama II

Programlama Dilleri 1. Ders 12: Belirleyiciler ve Niteleyiciler

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ KATI MODELĠ TEKNĠK RESME AKTARMA - 482BK0180

T.C. MİLLÎ EĞİTİM BAKANLIĞI DENİZCİLİK IĞRIP AVCILIĞI 624B00028

AYAKKABI VE SARACĠYE TEKNOLOJĠSĠ

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI METAL TEKNOLOJĠSĠ BORULARI BÜKME 521MMI219

ORTA ÖĞRETĠM PROJESĠ

// hataları işaret eden referans

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI UÇAK BAKIM. ATEġLEME SĠSTEMLERĠ 525MT0045

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Pointers (İşaretçiler)

ÖĞRENME FAALĠYETĠ 5 ÖĞRENME FAALĠYETĠ 5

public static int Toplam int x, int y

HSancak Nesne Tabanlı Programlama I Ders Notları

ALGORİTMA VE PROGRAMLAMA II

Ders 8: Metotlar. barisgokce.com

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Transkript:

T.C. MĠLLÎ EĞĠTĠM BAKANLIĞI BĠLĠġĠM TEKNOLOJĠLERĠ NESNE TABANLI PROGRAMLAMADA DEĞERLER VE BAġVURULAR 482BK0158 Ankara, 2012

Bu modül, mesleki ve teknik eğitim okul/kurumlarında uygulanan Çerçeve Öğretim Programlarında yer alan yeterlikleri kazandırmaya yönelik olarak öğrencilere rehberlik etmek amacıyla hazırlanmıģ bireysel öğrenme materyalidir. Millî Eğitim Bakanlığınca ücretsiz olarak verilmiģtir. PARA ĠLE SATILMAZ.

ĠÇĠNDEKĠLER AÇIKLAMALAR... ii GĠRĠġ... 1 ÖĞRENME FAALĠYETĠ 1... 3 1. VERĠ TÜRÜ DEĞĠġKENLER... 3 1.1. Veri Türü DeğiĢkenleri ve Sınıfları Kopyalama... 3 1.2. Null Değerler... 4 1.2.1. BoĢ Olabilen Türler... 5 1.2.2. BoĢ Olabilen Türlerin Özellikleri... 6 UYGULAMA FAALĠYETĠ... 7 ÖLÇME VE DEĞERLENDĠRME... 10 ÖĞRENME FAALĠYETĠ 2... 11 2. BAġVURU PARAMETRELERĠ... 11 2.1. ref ve out Parametreleri... 12 2.1.1. ref Parametresi... 12 2.1.2. out Parametresi... 12 2.2. Yığın (Stack) ve Öbek (Heap)... 13 2.3. System.Object Sınıfı... 14 UYGULAMA FAALĠYETĠ... 15 ÖLÇME VE DEĞERLENDĠRME... 17 ÖĞRENME FAALĠYETĠ 3... 18 3. BOXING VE UNBOXING... 18 3.1. Kutulama (Boxing)... 18 3.2. Kutulamayı Kaldırma (UnBoxing)... 19 3.3. Verileri Güvenli Olarak DönüĢtürme... 20 3.3.1. is ĠĢleci... 20 3.3.2. as ĠĢleci... 21 UYGULAMA FAALĠYETĠ... 22 ÖLÇME VE DEĞERLENDĠRME... 24 MODÜL DEĞERLENDĠRME... 25 CEVAP ANAHTARLARI... 27 KAYNAKÇA... 28 i

AÇIKLAMALAR KOD 482BK0158 ALAN BiliĢim Teknolojileri DAL/MESLEK Veritabanı Programcılığı MODÜLÜN ADI Nesne Tabanlı Programlamada Değerler ve BaĢvurular Nesne tabanlı programlama dilinde değer türü ve baģvuru türü MODÜLÜN TANIMI değiģkenleri kullanma yeterliliğinin kazandırıldığı bir öğrenme materyalidir. SÜRE 40/24 ÖN KOġUL YETERLĠK MODÜLÜN AMACI EĞĠTĠM ÖĞRETĠM ORTAMLARI VE DONANIMLARI ÖLÇME VE DEĞERLENDĠRME AÇIKLAMALAR Nene Tabanlı Programlamada Sınıflar modülünü almıģ olmak Değer türü ve baģvuru türü değiģkenleri kullanabilmek Genel Amaç Bu modül ile gerekli ortam sağlandığında değer türü ve baģvuru türü değiģkenleri kullanabileceksiniz. Amaçlar 1. Veri türü değiģkenlerini kullanabileceksiniz. 2. ref ve out parametrelerini kod içerisinde kullanabileceksiniz. 3. Kutulama (boxing) yapabileceksiniz. Ortam: Veritabanı Programcılığı Atölyesi Donanım: Visual studio programını yeterli hızda çalıģtırabilecek bir bilgisayar Modül içinde yer alan her öğrenme faaliyetinden sonra verilen ölçme araçları ile kendinizi değerlendireceksiniz. Öğretmen modül sonunda ölçme aracı (çoktan seçmeli test, doğru-yanlıģ testi, boģluk doldurma, eģleģtirme vb.) kullanarak modül uygulamaları ile kazandığınız bilgi ve becerileri ölçerek sizi değerlendirecektir. ii

GĠRĠġ GĠRĠġ Sevgili Öğrenci, Nesne yönelimli programlama dillerini kullanabilmek için sınıfları oluģturabilme ve kullanabilmenin ne kadar önemli olduğunu artık biliyorsunuz. Sınıfları ve diğer değiģken türlerini etkin ve hatasız biçimde kullanabilmek ve uygulama geliģtirebilmek için oldukça önemlidir. Sınıflar ve diğer değiģken türlerinin hafızada nasıl yönetildiğini anladığınızda uygulamalarınızı geliģtirirken hata ayıklama sürecinde bilgi eksikliğinizden kaynaklanan zaman kayıplarından kurtulmuģ olacaksınız. Nesne Tabanlı Programlamada Sınıflar modülünde kendi sınıfınızı bildirmeyi ve bir sınıf kurucusunu new anahtar sözcüğüyle çağırarak sınıfınızın örneklerini oluģturmayı (yani nesne oluģturmayı) öğrendiniz. Ayrıca, bir kurucu kullanarak nesneye nasıl baģlangıç değeri atayacağınızı gördünüz. Bu modülde ise int, double ve char gibi temel türlerin kendine has özelliklerinin sınıf türlerinden farkını öğreneceksiniz. 1

2

ÖĞRENME FAALĠYETĠ 1 AMAÇ ÖĞRENME FAALĠYETĠ 1 Veri türü değiģkenlerini kullanabileceksiniz. ARAġTIRMA Programlama dilinde kullanılan değiģken türlerini değer türü ve baģvuru türü değiģkenler olarak sınıflandırınız. 1. VERĠ TÜRÜ DEĞĠġKENLER Veri türü değiģkenler, tanımlandığında derleyici tarafından yeterli bellek alanı ayrılan ve değiģkenin saklayacağı değerin bu bellek alanında tutulduğu değiģkenlerdir. Örneğin, byte türünde bir değiģken tanımlanırsa derleyici bu değiģkenin değerini saklamak için bize 1 bayt (8 bit) bellek alanı ayırır. Tanımlanan bu değiģkene bir değer (örneğin, 135) atandığında, bu değer ayrılan 1 baytlık bellek alanına yazılır. BaĢvuru türü değiģkenler tanımlandığında, değer türü değiģkenlerden farklı olarak derleyici tarafından hafızada değeri saklamak için bellek alanı ayrılmaz. Bunu yerine, değeri saklayacak baģka bir bellek alanının adresini tutabilecek kadar küçük bir bellek alanı ayırır. Sınıflar baģvuru türü değiģkenlerdir. Örneğin, kendi oluģturduğumuz bir sınıf olan Bisiklet türünde bir değiģken tanımlandığında Bisiklet değiģkeninin değerini tutmak için değil, Bisiklet değiģkeninin değerini içeren baģka bir belleğin adresini tutmak için gereken bellek ayrılır. Yani değerin kendi değil, değere baģvuruda bulunan bellek adresi tutulur. 1.1. Veri Türü DeğiĢkenleri ve Sınıfları Kopyalama BaĢvuru türlerinin değer türlerinden farkını daha iyi anlatabilmek için önce iki değer türü değiģkenin durumu incelenmelidir. AĢağıdaki örnekte a adında int değer türünde bir değiģken tanımlanıyor ve 16 ilk değeri atanıyor. Ardından yine int türünde tanımlanan b değiģkenine a değiģkeninin değeri ilk değer olarak atanıyor. Bu iki satır kodun sonucu olarak a ve b değiģkenleri aynı değeri (16) saklıyor olsalar da 16 değerini içeren iki bellek alanı bulunur. Bellek alanlarından biri a değiģkeninin değerini, diğeri ise b değiģkeninin değerini saklar. Üçüncü satırdaki a değiģkeninin değerinin 1 artırılması b değiģkenini etkilemez. int a = 16; int b = a; a++; // a değişkeni tanımlanıyor // b değişkeni a'daki verinin kopyasını içerir // a'yı artırmak b'nin değerini ekilemez Programlama dilinde tanımlanan bütün sınıflar baģvuru türüdür. BaĢvuru türü olan c ile d değiģkenlerinin durumu incelenmelidir. AĢağıda Bisiklet türünde tanımlanmıģ c ve d 3

değiģkenleri aynı bellek alanına baģvurmaktadır. Yani sadece bir Bisiklet nesnesi vardır. c ve d değiģkenlerinin her ikisi de ona baģvurmaktadır. Ġki örnekteki farkı daha kolay anlayabilmek için aģağıdaki ġekil 1.1 oluģturulmuģtur. Bisiklet nesnesindeki * iģareti bellekteki adrese baģvuruyu gösterir: Bisiklet c = new Bisiklet(16); Bisiklet d = c; 1.2. Null Değerler ġekil 1.1: Değer ve baģvuru türleri arasındaki fark ġimdiye kadar tanımlanan değiģkenlere genellikle aģağıdaki gibi bir ilk değer ataması yapıldı. int s = 0; double x = 0.0; BaĢvuru değiģken türü olan sınıfların yeni bir örneği oluģturulurken new anahtar sözcüğü ile nesneye bir ilk değer verildi. Bisiklet bisiklet1 = new Bisiklet(18); Bazı durumlarda değiģkene baģlangıç değeri atama sonraya bırakılabilir. Ancak bu iyi bir alıģkanlık değildir. Zaten katı kuralları olan programlama dili ilk değer atanmamıģ bir değiģkeni kullanmak istenildiğinde derleme hatası verecektir. 4

Bisiklet bisiklet1 = new Bisiklet(); Bisiklet bisiklet2; // İlk değer atanmamış if (bisiklet2 == null ) // Derleme hatası verir bisiklet2 = bisiklet1; Yukarıdaki if ifadesi ile bisiklet2 değiģkenine bir baģlangıç değeri atanıp atanmadığı kontrol edilmek istenmiģtir. Fakat bu değiģken eğer ilk değer atanmadı ise hangi değeri taģımaktadır? Bu sorunun cevabı null (boģ anlamına gelir) adı verilen özel bir değerdir. Programlama dilinde baģvuru türü değiģkenlere null değeri atanabilir. Bir değiģkene null değeri atandığında, bu o değiģkenin bellekte hiçbir nesneye baģvurmadığı anlamına gelir. Bisiklet bisiklet1 = new Bisiklet(); Bisiklet bisiklet2 = null; if (bisiklet2 == null) bisiklet2 = bisiklet1; 1.2.1. BoĢ Olabilen Türler Null değeri, baģvuru türlerine baģlangıç değeri vermek için kullanıģlıdır. Fakat null değerinin kendisi bir baģvurudur ve bir değer türüne atanamaz. Bu nedenle aģağıdaki ifade programlama dilinde geçerli bir ifade değildir: int a = null; // geçerli değil Bununla birlikte, C# bir değiģkeni boģ olabilen (nullable) değer türü olarak bildirmek için kullanılabilecek bir değiģtirici tanımlar. BoĢ olabilen değer türü, orijinal değer türü ile benzer Ģekilde davranır fakat null değeri atanabilir. AĢağıdaki gibi değer türünün boģ olabileceğini göstermek için soru iģareti (?) operatörü kullanılır: int? b = null; // geçerli BaĢvuru türü test edilen yöntemle boģ olabilen değiģkenin null değer içerip içermediği bulunabilir: if (b == null) 5

Uygun veri türü ifadesi doğrudan boģ olabilen değiģkene atanabilir. AĢağıdaki örnekler geçerli ifadelerdir: int? b = null; int a = 15; b = 16; b = a; // Bir sabiti boş olabilen türe kopyalar // Değer türü değişkenini boş olabilen türe kopyalar Bunun tersi ise geçerli değildir. Yani boģ olabilen bir değer, sıradan değer türü değiģkenine atanamaz. Bu nedenle, bir önceki örnekteki a ve b değiģkenlerine göre aģağıdaki ifade geçerli değildir: a = b; // Geçerli değil 1.2.2. BoĢ Olabilen Türlerin Özellikleri BoĢ olabilen türlerin sahip olduğu HasValue (değere sahip mi?) özelliği boģ olabilen bir türün bir değere mi sahip olduğunu yoksa null mu olduğunu kontrol edebilmeyi sağlar. AĢağıdaki gibi value (değer) özelliğini okuyarak bir değer içeren, boģ olabilen türün değeri elde edilebilir: int? b = null;.. if (!b.hasvalue) b = 15; else Console.WriteLine(b.Value); Yukarıdaki kod parçası, boģ olabilen b değiģkenin HasValue özelliği false (! işlecine dikkat ediniz) ise 15 değeri atar. Aksi takdirde değiģkenin değerini görüntüler. 6

UYGULAMA FAALĠYETĠ UYGULAMA FAALĠYETĠ Veri türü değiģkenlerini kullanınız. ĠĢlem Basamakları Nesne Tabanlı Programlama yazılımını baģlatınız. BasvuruTuruKopyalama adında yeni bir konsol uygulaması oluģturunuz. Solution Explorer da Program.cs dosyasına çift tıklayınız. Program sınıfında Main metodunu bulunuz ve bu metodun üst kısmında Bisiklet sınıfını aģağıdaki gibi oluģturunuz. Öneriler Örnek projelerinizi kendinize ait bir klasör içerisinde oluģturursanız baģka ortamda çalıģmanız daha kolay olacaktır. Uygun programlama dilini seçmeyi unutmayınız. Solution Explorer penceresi görünmüyorsa View menüsünü kullanınız. class Bisiklet int hiz = 0; int vites = 0; public Bisiklet() vites = 18; public void Hizlan(int artis) hiz = hiz + artis; public void BilgileriYaz() Console.Write("Vites:0 ", vites); Console.Write("Hız: 0", hiz); Main metodunun içerisinde Bisiklet nesnesi oluģturunuz ve new anahtar sözcüğü ile ilk değeri veriniz. Ġkinci bir Bisiklet nesnesi tanımlayın ve ilk değer olarak az önce oluģturduğunuz nesneyi atayınız. OluĢturduğunuz ilk Bisiklet nesnesinin Hizlan yöntemini çağırınız. 7 Yazdığınız sınıfın Program sınıfının içinde olmasına dikkat ediniz. OluĢturduğunuz nesneye anlamlı isimler veriniz (bisiklet1). OluĢturduğunuz nesneye anlamlı isimler verin (bisiklet2). Bu sefer new anahtar sözcüğü ile ilk değer vermediğinizi unutmayınız. Yönteme tamsayı türünde parametre değeri vermeyi unutmayınız.

Her iki nesnenin de BilgileriYaz yöntemlerini çağırarak sonuçları inceleyiniz. Diğer Bisiklet nesnesinin Hizlan yöntemini çağırmadığınız hâlde bilgilerin neden aynı olduğunu tartıģınız. 8

KONTROL LĠSTESĠ Bu faaliyet kapsamında aģağıda listelenen davranıģlardan kazandığınız beceriler için Evet, kazanamadıklarınız için Hayır kutucuklarına ( X ) iģareti koyarak öğrendiklerinizi kontrol ediniz. Değerlendirme Ölçütleri 1. Nesne TabanĢı Programlama yazılımını doğru Ģekilde baģlattınız mı? 2. Konsol uygulamasını belirli bir klasörde oluģturdunuz mu? 3. Program.cs dosyasını kod düzenleyicide açtınız mı? 4. Sınıf tanımlamasını doğru yerde yaptınız mı? 5. Nesne örneklerini oluģturdunuz mu? 6. OluĢturduğunuz nesnenin Hizlan yöntemini kullandınız mı? 7. OluĢturduğunuz nesnenin BilgileriYaz yöntemini kullandınız mı? 8. Sonuçların neden aynı olduğunu açıklayabildiniz mi? Evet Hayır DEĞERLENDĠRME Değerlendirme sonunda Hayır Ģeklindeki cevaplarınızı bir daha gözden geçiriniz. Kendinizi yeterli görmüyorsanız öğrenme faaliyetini tekrar ediniz. Bütün cevaplarınız Evet ise Ölçme ve Değerlendirme ye geçiniz. 9

ÖLÇME VE DEĞERLENDĠRME ÖLÇME VE DEĞERLENDĠRME AĢağıdaki cümlelerde boģ bırakılan yerlere doğru sözcükleri yazınız. 1. türü değiģkeni baģka bir değer türü değiģkene kopyalandığında aynı değerin iki kopyası elde edilir. Ancak değiģkenlerden birinin değeri değiģtirildiğinde diğeri bundan etkilenmez. 2. türü bir değiģken tanımladığınızda derleyici (belirlediğiniz türün değerini tutacak) bir bellek bloğunun adresini tutacak kadar küçük bir bellek alanı ayırır. 3. Programlama dilinde tanımlanan bütün baģvuru türüdür. 4. Programlama dilinde tüm türü değiģkenler boģ değer alabilir. AĢağıdaki soruları dikkatlice okuyunuz ve doğru seçeneği iģaretleyiniz. 5. Programlama dilinde bir değiģkenin değeri boģ ise bu değiģkenin değeri aģağıdakilerden hangisidir? A) Void B) 0 C) null D) -1 6. AĢağıdaki karakterlerden hangisi C# programlama dilinde değer türünün boģ olabileceğini göstermek için kullanılır? A) * B)? C) // D) /* 7. AĢağıdaki kod parçasının kaçıncı satırı derleyici hatasına sebep olur? int? x = null; // 1. Satır int y = 15; // 2. Satır x = 16; // 3. Satır x = y; // 4. Satır y = x; // 5. Satır A) 2 B) 3 C) 4 D) 5 DEĞERLENDĠRME Cevaplarınızı cevap anahtarıyla karģılaģtırınız. YanlıĢ cevap verdiğiniz ya da cevap verirken tereddüt ettiğiniz sorularla ilgili konuları faaliyete geri dönerek tekrarlayınız. Cevaplarınızın tümü doğru ise bir sonraki öğrenme faaliyetine geçiniz. 10

ÖĞRENME FAALĠYETĠ 2 AMAÇ ÖĞRENME FAALĠYETĠ 2 Bu öğrenme faaliyeti sonunda ref ve out anahtar sözcüklerini kullanarak baģvuru parametrelerini ihtiyaç duyduğunuz yerde hatasız olarak kullanabilecek, değer veya baģvuru türlerini kullandığınızda belleğin yığın (stack) ve öbek (heap) bölümlerinin nasıl yönetildiğini görecek ve önemli sınıflardan birisi olan System.Object sınıfını kullanabileceksiniz. ARAġTIRMA Programlama dillerinde iģaretçilerin (pointer) ne amaçla kullanıldığını araģtırınız. Bilgisayar belleğinin hangi kısımlardan oluģtuğunu ve her bir kısmın ne amaçla kullanıldığını araģtırınız. 2. BAġVURU PARAMETRELERĠ Daha önce yöntemlere parametre olarak bir değiģken aktarıldığında parametrenin değiģkenin kopyasının oluģturulduğu biliniyor. Bu durum parametre değer türü (int gibi), boģ olabilen tür (int? gibi) ya da baģvuru türü (Bisiklet gibi) bile böyledir. Bu da yöntem içerisinde parametrenin değerinin değiģtirilmesinin aktarılan değiģkenin değerini etkilemeyeceği anlamına gelir. Örneğin, aģağıdaki kodda, konsola yazılan sonuç 11 değil 10 dur. DegerArtir yöntemi, orijinal değiģkenin (a) değil değiģkenin kopyası olan deger değiģkeninin değerini artırır: static void DegerArtir(int deger) deger++; static void Main() int a = 10; DegerArtir(a); Console.WriteLine(a); // 10 yazar 11

2.1. ref ve out Parametreleri Programlama dilinde yönteme aktarılan değiģkenin kendi değerini değiģtirmek için ise ref ve out anahtar sözcükleri kullanılır. 2.1.1. ref Parametresi Yöntem bildiriminde kullanılan bir parametrenin adının önüne ref yazılırsa değiģkenin değeri değil, değiģkenin yığındaki (stack teki) adresi parametre olarak gönderilmiģ olunur. Bu yapıldığında artık parametrenin değerini değiģtirmek, değiģkenin değerini değiģtirmek anlamına gelir. DeğiĢkeni bir ref parametresine aktarırken değiģkenin önüne de ref yazılmalıdır. Bu söz dizimi, bağımsız değiģkenin değiģebileceğine dair görsel bir ipucu verir. AĢağıda, önceki örneğin ref anahtar sözcüğü kullanılarak yazılmıģ biçimi görülebilir: static void DegerArtir(ref int deger) deger++; static void Main() int a = 10; DegerArtir(ref a); Console.WriteLine(a); // 11 yazar Bu defa, DegerArtir yöntemine orijinal değiģkenin kopyası yerine orijinal değiģkene bir baģvuru tanımla. Böylece yöntemin bu baģvuruyu kullanarak yaptığı her değiģiklik orijinal bağımsız değiģkeni de değiģtirdi ve bu nedenle konsolda 11 yazdı. 2.1.2. out Parametresi out anahtar sözcüğü de aslında ref anahtar sözcüğüne benzer. Aralarındaki fark out anahtar sözcüğünün değiģkenlerin ilk değer verilmeden de parametre olarak aktarılmasını mümkün kılmasıdır. Örneğin ref anahtar sözcüğü kullanılan aģağıdaki kod derleme sırasında hata verir. static void DegerArtir(ref int deger) deger = 10; deger++; static void Main() 12

int a; // İlk değer verilmemiş DegerArtir(ref a); // Derleme hatası Console.WriteLine(a); Oysa aynı örneği aģağıdaki gibi out anahtar sözcüğü kullanılarak denildiğinde çalıģacaktır. static void DegerArtir(out int deger) deger = 10; deger++; static void Main() int a; DegerArtir(out a); Console.WriteLine(a); // 11 yazar 2.2. Yığın (Stack) ve Öbek (Heap) Yazılan programlar ve bu programların kullandığı veriler bellek üzerinde tutulur. Değer ve baģvuru türleri arasındaki farkları anlamak için verinin bellekte nasıl düzenlendiğini iyi anlamak gerekir. ĠĢletim sistemleri ve çalıģma zamanları sık sık veriyi tutmak için kullanılan belleği her biri ayrı olarak yönetilen iki büyük parçaya ayırır. Belleğin iki büyük parçasına yığın (stack) ve öbek (heap) adı verilir. Yığın ve öbek çok farklı amaçlara hizmet eder: Yöntem parametreleri ve yerel değiģkenleri her zaman yığın üzerinde oluģturulur. Yöntem bittiğinde parametreler ve yerel değiģkenler için alınan bellek otomatik olarak geri verilir. new anahtar sözcüğünü kullanarak bir nesne (sınıf örneği) yaratıldığında, nesneyi oluģturmak için gerekli bellek her zaman öbek üzerinde oluģturulur. Tüm değer türleri yığın üzerinde yaratılır. Tüm baģvuru türleri (nesneler) öbek üzerinde yaratılır (baģvurunun kendisi de yığın üzerinde olduğu hâlde). BoĢ olabilen türler aslında baģvuru türleridir ve öbek üzerinde yaratılır. 13

2.3. System.Object Sınıfı Programlama dili System.Object sınıfını object anahtar sözcüğüyle de kullanabilmeyi sağlar. Buradan da anlaģılabileceği gibi System.Object önemli bir sınıftır. BaĢvuru türü olan herhangi bir değiģkene baģvuruda bulunan bir değiģken oluģturmak için System.Object sınıfı kullanılabilir. ġekil 2.1 de bu durumdaki bellek yerleģimi gösterilmiģtir. Bisiklet c; c = new Bisiklet(18); object o; o = c; ġekil 2.1: System.Object sınıfı ile baģvuru türünde bir değiģkene baģvuru oluģturma 14

UYGULAMA FAALĠYETĠ UYGULAMA FAALĠYETĠ ref ve out parametrelerini kod içerisinde kullanınız. ĠĢlem Basamakları Nesne Tabanlı Programlama yazılımını baģlatınız. refornegi adında yeni bir konsol uygulaması oluģturunuz. Solution Explorer de Program.cs dosyasına çift tıklayınız. Program sınıfında Main yöntemini bulun ve bu yöntemin üst kısmında ref parametresi alan DegerArtir adında bir yöntem oluģturunuz. DegerArtir yöntemi içerisinde yönteme aktarılan parametre değerini 1 artıran kodu yazınız. Main yönteminin içerisinde tamsayı türünde bir değiģken tanımlayıp bir ilk değer atayınız. Az önce tanımladığınız değiģkeni parametre olarak alan DegerArtir yöntemini çağırınız. Tamsayı değiģkeninin değerini ekrana yazdırıp değiģkenin değerinin arttığından emin olunuz. Öneriler Örnek projelerinizi kendinize ait bir klasör içerisinde oluģturursanız baģka ortamda çalıģmanız daha kolay olacaktır. Programama dilini seçmeyi unutmayınız. Solution Explorer penceresi görünmüyorsa View menüsünü kullanınız. Yazdığınız sınıfın Program sınıfının içinde olmasına dikkat ediniz. 15

KONTROL LĠSTESĠ Bu faaliyet kapsamında aģağıda listelenen davranıģlardan kazandığınız beceriler için Evet, kazanamadıklarınız için Hayır kutucuklarına ( X ) iģareti koyarak öğrendiklerinizi kontrol ediniz. Değerlendirme Ölçütleri 1. Nesne Tabanlı Programlama yazılımını doğru Ģekilde baģlattınız mı? 2. Konsol uygulamasını belirli bir klasörde oluģturdunuz mu? 3. Program.cs dosyasını kod düzenleyicide açtınız mı? 4. Yöntem tanımlamasını doğru yerde yaptınız mı? 5. Ref parametre tanımını doğru yapabildiniz mi? 6. Yöntemi doğru Ģekilde çağırabildiniz mi? 7. DeğiĢkenin değerinin nasıl arttığını açıklayabildiniz mi? Evet Hayır DEĞERLENDĠRME Değerlendirme sonunda Hayır Ģeklindeki cevaplarınızı bir daha gözden geçiriniz. Kendinizi yeterli görmüyorsanız öğrenme faaliyetini tekrar ediniz. Bütün cevaplarınız Evet ise Ölçme ve Değerlendirme ye geçiniz. 16

ÖLÇME VE DEĞERLENDĠRME ÖLÇME VE DEĞERLENDĠRME AĢağıdaki cümlelerde boģ bırakılan yerlere doğru sözcükleri yazınız. 1. Yöntem bildirimde kullanılan ilk değeri atandığı bilinen bir parametrenin adının önüne yazılırsa parametre değiģkenin kopyası olmak yerine onun diğer adı olur. 2. Yöntem parametreleri ve yerel değiģkenleri her zaman üzerinde oluģturulur. 3. new anahtar sözcüğünü kullanarak bir nesne (sınıf örneği) yaratıldığında, nesneyi oluģturmak için gerekli bellek her zaman üzerinde oluģturulur. AĢağıdaki cümlelerin baģında boģ bırakılan parantezlere, cümlelerde verilen bilgiler doğru ise D, yanlıģ ise Y yazınız. 4. ( ) Tüm değer türleri yığın üzerinde yaratılır. 5. ( ) Tüm baģvuru türleri (nesneler) yığın üzerinde yaratılır (baģvurunun kendisi de yığın üzerinde olduğu hâlde). DEĞERLENDĠRME Cevaplarınızı cevap anahtarıyla karģılaģtırınız. YanlıĢ cevap verdiğiniz ya da cevap verirken tereddüt ettiğiniz sorularla ilgili konuları faaliyete geri dönerek tekrarlayınız. Cevaplarınızın tümü doğru ise bir sonraki öğrenme faaliyetine geçiniz. 17

ÖĞRENME FAALĠYETĠ 3 AMAÇ ÖĞRENME FAALĠYETĠ 3 Bu öğrenme faaliyeti sonunda programlarınız içerisinde bir değere kutulama uygulayabilecek, kutulanmıģ değerin gereken yerde kutulamasını kaldırabilecek ve ihtiyaç duyduğunuzda nesne dönüģtürme iģlemini uygun yerde hatasız olarak yapabileceksiniz. ARAġTIRMA Programlama dilinde tür dönüģümü (casting) iģleminin hangi durumlarda yapıldığını araģtırınız. 3. BOXING VE UNBOXING Önceki öğrenme faaliyetinde object türündeki değiģkenlerin her baģvuru türündeki nesneye baģvurulabileceği öğrenildi. ġimdi ise object türündeki değiģkenlerin bir değer türüne baģvurduğunda ve object türündeki bir değiģkenin bir değer türüne dönüģtürüldüğünde neler olduğu incelenecektir. 3.1. Kutulama (Boxing) Object türündeki değiģkenler bir değer türüne de baģvurulabilir. Örneğin, aģağıdaki iki ifade, a değiģkenine 15 baģlangıç değerini atar ve daha sonra o değiģkenine baģlangıç değeri olarak a atar: int a = 15; object o = a; Ġkinci ifadede tam olarak neler olduğunu anlamak için biraz açıklama gerekir. a değiģkeninin değer türünde olduğunu ve yığında tutulduğunu söylenmiģti. o değiģkeni içindeki baģvuru, doğrudan a değiģkenine baģvuruyorsa baģvuru yığın üzerindeki değere olacaktır. Ancak tüm baģvurular öbek üzerindeki nesnelere baģvurmalıdır. Yığın üzerindeki öğelere baģvuru oluģturulamaz. Bu nedenle a içindeki değerin bir kopyası öbek üzerinde oluģturulur ve o içindeki baģvuru bu kopyaya olur. Öğenin yığından öbeğe otomatik kopyalanmasına kutulama (boxing) adı verilir. ġekil 3.1 de bu durum gösterilmiģtir. 18

ġekil 3.1: Kutulama (Boxing) 3.2. Kutulamayı Kaldırma (UnBoxing) Program içerisinde bazen kutulanmıģ değerlerin değer türünde değiģkenlere aktarılması gerekir. Bu durumda kutulamayı kaldırmak zorunlu olur. Örneğin, az önceki örnekte int değer türündeki a değiģkenine, içerisinde 15 tam sayı değerine baģvuruyu barındıran object baģvuru türündeki o değiģkeni atamaya çalıģılırsa derleme hatasıyla karģılaģılır. int a = 15; object o = a; a = o; // Derleyici hatası Aslında yukarıdaki kod ilk bakıģta o değiģkeni tam sayı bir değere baģvuruda bulunduğu için mantıklı gibi görünebilir. Ancak object türündeki o değiģkeninin baģvuru türünde herhangi bir değiģkene baģvurabileceği de unutulmamalıdır. AĢağıdaki örneği incelendiğinde derleyicinin neden hata verdiği daha iyi görülebilir. Bisiklet b = new Bisiklet(); int a = 10; object o; o = b; a = o; // int türüne Bisiklet başvuru türü aktarılmaya çalışılıyor 19

Peki, kutulama kaldırıldığın ne yapılmalıdır? KutulanmıĢ değeri elde etmek için casting olarak bilinen ve bir türü diğerine dönüģtüren iģlem kullanılır. Bu, dönüģtürülmek istenen değiģkenin önüne parantez içinde türün adı yazılarak yapılır. int i = 15; object o = i; i = (int)o; // kutulama // kutulamayı kaldırma Bu dönüģtürme iģlemi daha iyi anlayabilmek için aģağıdaki ġekil 3.2 oluģturulmuģtur. ġekil 3.2: Kutulamayı kaldırma (UnBoxing) 3.3. Verileri Güvenli Olarak DönüĢtürme Derleyiciler her ne kadar yapılan hatalar hemen bildirilerek iģi kolaylaģtırsalar da bazı durumlarda derleyiciye yol göstermek gerekir. DönüĢtürme iģlem kullanılarak derleyiciye bir nesne tarafından baģvurulan verinin özel bir türe sahip olduğu ve bu türü kullanarak nesneye baģvurmanın güvenli olduğu belirtilebilir. Programlama dili dönüģtürme iģlemini gerçekleģtirmeye yardımcı olabilecek oldukça kullanıģlı iki iģleç daha sunar: is ve as iģleçleri 3.3.1. is ĠĢleci DeğiĢken türünün istenilen türde olduğunu doğrulamak için is iģleci kullanılabilir. is iģleci iki iģlenen alır. is iģlecinin sol tarafına doğrulamak istenilen değiģkeni, sağ tarafına ise tür adı yazılır. int i = 15; object o = i; if (o is int) i = (int)o; // Güvenli kod: o int türündedir Yukarıdaki örnekte de rahatlıkla görülebileceği gibi o değiģkeninin baģvurduğu değer türü eğer belirlenen türe (int) sahipse is iģleci true, aksi takdirde false sonucu verir. 20

3.3.2. as ĠĢleci DeğiĢken türünün hangi türde olduğunu derleyiciye anlatmak için as iģleci kullanılabilir. as iģleci de iki iģlenen alır. Bisiklet b = new Bisiklet(); object o = b; Bisiklet c = o as Bisiklet; as iģleci nesneyi belirtilen türe dönüģtürmeye çalıģır. BaĢarılı ise sonuç döndürülür. DönüĢtürme baģarılı değilse as iģleci null sonucu verir. 21

UYGULAMA FAALĠYETĠ UYGULAMA FAALĠYETĠ Kutulama (boxing) yapınız. ĠĢlem Basamakları Nesne Tabanlı programlama yazılımını baģlatınız. kutulamaornegi adında yeni bir konsol uygulaması oluģturunuz. Solution Explorer de Program.cs dosyasına çift tıklayınız. int ve object türünden değiģkenler oluģturarak int türündeki değiģkene değer atayınız. Değerlerin (Boxing)kutulanmasını ve (UnBoxing) kutulamayı kaldırma iģlemlerini uygulayınız. DeğiĢik türden değiģkenler tanımlayarak is ve as iģleçlerini kullanarak değerlerin hangi türden olduğunu tespit ediniz. Öneriler Örnek projelerinizi kendinize ait bir klasör içerisinde oluģturursanız baģka ortamda çalıģmanız daha kolay olacaktır. Programlama dilini seçmeyi unutmayınız. Solution Explorer penceresi görünmüyorsa View menüsünü kullanınız. 22

KONTROL LĠSTESĠ Bu faaliyet kapsamında aģağıda listelenen davranıģlardan kazandığınız beceriler için Evet, kazanamadıklarınız için Hayır kutucuklarına ( X ) iģareti koyarak öğrendiklerinizi kontrol ediniz. Değerlendirme Ölçütleri Evet Hayır 1. Nesne Tabanlı Programlama yazılımını doğru Ģekilde baģlattınız mı? 2. Konsol uygulamasını belirli bir klasörde oluģturdunuz mu? 3. Program.cs dosyasını kod düzenleyicide açtınız mı? 4. İnt ve object türündedeğiģken atabildiniz mi? 5. Değerlerin kutulamasını (Boxing) yapabildiniz mi? 6. Değerlerin kutulama kaldırmasını (Unboxing) yapabildiniz mi? 7. is ve as iģleçleri ile değerlerin hangi türden olduğunu tespit edebildiniz mi? DEĞERLENDĠRME Değerlendirme sonunda Hayır Ģeklindeki cevaplarınızı bir daha gözden geçiriniz. Kendinizi yeterli görmüyorsanız öğrenme faaliyetini tekrar ediniz. Bütün cevaplarınız Evet ise Ölçme ve Değerlendirme ye geçiniz. 23

ÖLÇME VE DEĞERLENDĠRME ÖLÇME VE DEĞERLENDĠRME AĢağıdaki cümlelerde boģ bırakılan yerlere doğru sözcükleri yazınız. 1. Öğenin yığından öbeğe otomatik kopyalanmasına adı verilir. 2. KutulanmıĢ değeri elde etmek için olarak bilinen ve bir türü diğerine dönüģtüren iģlem kullanılır. 3. DeğiĢken türünün istenilen türde olduğunu doğrulamak için iģleci kullanılabilir. 4. DeğiĢken türünün hangi türde olduğunu anlatmak için as iģleci kullanılabilir. 5. KutulanmıĢ değeri elde etmek için. olarak bilinen ve bir türü diğerine dönüģtüren iģlem kullanılır. DEĞERLENDĠRME Cevaplarınızı cevap anahtarıyla karģılaģtırınız. YanlıĢ cevap verdiğiniz ya da cevap verirken tereddüt ettiğiniz sorularla ilgili konuları faaliyete geri dönerek tekrarlayınız. Cevaplarınızın tümü doğru Modül Değerlendirme ye geçiniz. 24

MODÜL DEĞERLENDĠRME AĢağıdaki soruları dikkatlice okuyunuz ve doğru seçeneği iģaretleyiniz. 1. AĢağıdakilerden hangisi bir baģvuru türüdür? A) double B) int C) int? D) float 2. AĢağıdaki kod parçasında boģluk yerine hangisi yazılmalıdır? A) is B) as C) object D) int int a = 15; object o = a; if (o is int) a = ( )o; 3. AĢağıdaki kod parçası ekrana hangisini yazar? A) 15 B) 16 C) 14 D) 0 MODÜL DEĞERLENDĠRME static void DegerArtir(ref int y) y++; static void Main() int x = 15; DegerArtir(ref x); Console.WriteLine(x); 25

4. AĢağıdaki kod parçası ekrana hangisini yazar? A) 0 B) 41 C) 42 D) 43 int a = 42; object o = a; a++; Console.Write(o.ToString()); AĢağıdaki cümlelerin baģında boģ bırakılan parantezlere, cümlelerde verilen bilgiler doğru ise D, yanlıģ ise Y yazınız. 5. ( ) DeğiĢken türünün istediğiniz türde olduğunu doğrulamak için as iģleci kullanılır. 6. ( ) DeğiĢkeni bir ref parametresine aktarırken değiģkenin önüne de ref yazılmalıdır. 7. ( ) Bir değiģkene null değeri atandığında, bu o değiģkenin bellekte hiçbir nesneye baģvurmadığı anlamına gelir. 8. ( ) new anahtar sözcüğü kullanılarak bir nesne (sınıf örneği) yaratıldığında, nesne oluģturmak için gerekli bellek her zaman yığın(stack) üzerinde oluģturulur. 9. ( ) Öğenin yığından öbeğe otomatik kopyalanmasına kutulama (boxing) adı verilir. 10. ( ) int a = null; geçerli bir ifadedir. DEĞERLENDĠRME Cevaplarınızı cevap anahtarıyla karģılaģtırınız. YanlıĢ cevap verdiğiniz ya da cevap verirken tereddüt ettiğiniz sorularla ilgili konuları faaliyete geri dönerek tekrarlayınız. Cevaplarınızın tümü doğru ise bir sonraki modüle geçmek için öğretmeninize baģvurunuz. 26

CEVAP ANAHTARLARI CEVAP ANAHTARLARI ÖĞRENME FAALĠYETĠ-1 ĠN CEVAP ANAHTARI 1 Değer / Veri 2 BaĢvuru 3 sınıflar 4 baģvuru 5 C 6 B 7 D ÖĞRENME FAALĠYETĠ-2 NĠN CEVAP ANAHTARI 1 ref 2 yığın 3 öbek 4 Doğru 5 YanlıĢ ÖĞRENME FAALĠYETĠ-3 ÜN CEVAP ANAHTARI 1 kutulama/boxing 2 casting 3 is 4 derleyiciye 5 casting MÖDÜL DEĞERLENDĠRMENĠN CEVAP ANAHTARI 1 C 2 D 3 B 4 C 5 Y 6 D 7 D 8 Y 9 D 10 Y 27

KAYNAKÇA KAYNAKÇA Sharp John, Adım Adım Microsoft C# 2008, ArkadaĢ Yayınevi, Ankara, 2009. 28