object bir genel veri tipi midir? [18]

object tüm diğer tiplerin temel sınıfı olduğu ve kutulama/kutudan çıkarma işlemleri değer tipleri için otomatik olarak işlendiği için, object'i genel bir veri tipi olarak kullanmak mümkündür. Örnek olarak, bir object dizisi oluşturan ve çeşitli diğer tiplerden verileri bu dizinin elemanlarına atayan aşağıdaki programı inceleyelim:

Kutulama ve Kutudan Çıkarma [17]

Daha önce de açıkladığımız gibi, değer tipleri de dahil olmak üzere tüm C# tipleri object'ten türetilirler. Bu nedenle, object tipine yapılan bir referans, değer tipleri de dahil olmak üzere tüm tiplere referansta bulunmak üzere kullanılabilir. Bir object referansı bir değer tipine referansta bulunduğunda kutulama(boxing) denilen bir süreç işler. Kutulama, bir değer tipinin değerinin bir nesne örneğinde depolanmasına neden olur. Dolayısıyla, bir değer tipi bir nesnenin içine "kutulanır". Bu nesne, diğer herhangi bir nesne gibi kullanılabilir. Kutulama her zaman
otomatik olarak yapılır. Sizin tek yapmanız gereken bir object referansına bir değer atamaktır. Gerisini C# halleder.

C# object [16]

C# 'ta object olarak adlandırılan özel bir sınıf tanımlıdır. object, tüm diğer sınıflar ve tüm diğer tipler (değer tipleri de dahil olmak üzere) için kapalı bir temel sınıf görevi görür. Bir başkadeyişle, tüm diğer tipler object'ten türetilir. Bu, object tipindeki bir referans değişkenin diğer herhangi tipteki bir nesneye referansta bulunabilmesi anlamına gelir. Ayrıca, diziler de sınıf olarak gerçeklendikleri için, object tipindeki bir değişken herhangi bir diziye de referansta bulunabilir. Teknik olarak, C#'taki object ismi aslında .NET Framework sınıf kütüphanesinin bir parçası olan System.Object için verilen bir başka isimdir. object sınıfı aşağıdaki tabloda gösterilen metotları tanımlar. Yani, bu metotlar her nesne için kullanıma hazırdır.
Bu metotlardan bazıları biraz daha açıklamak gerekli. Equals(object) metodu, kendisini çağıran nesnenin, ona aktarılan argümanla aynı nesneye referansta bulunup bulunmadığını saptar. (Bir başka ifade ile, iki referansın aynı olup olmadığını kontrol eder.) Bu metodu kendi oluşturduğunuz sınıflarda devre dışı bırakabilirsiniz. Bu sayede, "eşitliğin" bir sınıfta ne anlama geldiğini kendinize göre tanımlama olanağı bulursunuz.
Örneğin, Equals(object, object) metodu, sonucu hesaplamak için Equals(object)'i kullanır.

C#'da Operatörler

C# .NET dilinde aritmetiksel, aktarma, mantıksal, karşılaştırma, birleştirme operatörleri olarak beş çeşit operatör kullanılmaktadır.

ARİTMETİK OPERATÖRLER
------------------------------------

Kalıtımı önlemek için sealed kullanmak [15]

csharp blogsahin
Kalıtım her ne kadar güçlü ve kullanışlı olsa da kimi zaman bunu önlemek isteyeceksiniz. Örneğin, özelleştirilmiş bir donanım aygıtının, söz gelişi bir tıbbi monitörün ilk kullanıma hazırlanması ile ilgili adımları bir araya getiren bir sınıfınız olabilir. Böyle bir durumda, sınıfınızı kullanan kullanızıların monitörün ilk kullanıma hazırlanma şeklini değiştirebilmelerini istemezsiniz. Bu, aygıtın büyük olasılıkla hatalı olarak hazırlanmasına neden lacaktr. Sebep ne olursa olsub C#'ta sealed anahtar kelimesi kullanılarak bir sınıfın kalıtım yoluyla aktarılması kolaylıkla önlenebilir.

Özet Sınıfların Kullanımı - abstract [14]

Bazen, şöyle bir temel sınıf oluşturmak istersiniz: O sınıf sadece kendisinden türetilmiş sınıfların genelleştirilmiş bir şekli olmalı, detaylar her bir türetilmiş sınıf tarafından doldurulmalıdır. Bu tür bi sınıf, türetilmiş sınıfların uygulamaları gereken metotların özünü belirler, fakat bu metotlardan biri ya da daha fazlasi için kendisi bir uygulama sağlamaz. Temel sınıf, anlamlı bir metot uygulaması oluşturamadığı zaman böyle bir durumla karşılaşılabilir. TwoDShape'in yukarıdaki örnekte(konu [13]) kullanılan versiyonunda bu tür bir durum söz konusudur. area()'nın tanımı yalnızca bir yer belirteci olmaktan ibarettir. area(), hiçbir nesne tipinin alanını hesaplayıp, ekranda göstermez.

Kendi sınıf kütüphanelerinizi oluşturdukça göreceksiniz ki, bir metodun kendi temel sınıfı kapsamında anlamlı bir tanımının olmaması yaygın bir kullanım değildir. Bu durumu iki şekilde kontrol altına alınabilir. Birincisi, önceki örnekte gösterildiği gibi metodun bir uyarı mesajı vermesi yeterlidir. Bu yöntem belirli durumlarda -örneğin hata ayıklama sırasında- yararlı olsa da bu yöntemi uygulamak genellikle uygun değildir. Türetilmiş sınıfın bir anlam taşıması için türetilmiş sınıf tarafından devre dışı bırakılması gereken metotlara sahip olabilirsiniz. Triangle sınıfını ele aldğımız zaman area() tanımlanmazsa bu sınıfın bir anlamı kalmaz. Bu durumda, türetilmiş sınıfın gerçekten gerekli metotların tümünü devre dışı bırakmasını garanti edecek bir çözüme ihtiyacınız olur. Bu probleme C#'ın getirdiği çözüm özet metot kullanımıdır.

Sanal Metotları Uygulamak [13]

Sanal metotların gücünü daha iyi kavramak için bu metotları TwoDShape sınıfına uygulayacağız. önceki örneklerde, TwoDShape'ten türetilen her sınıf, area() adında bir metot tanımlamaktaydı. Bu kullanım bize bir fikir verir: area()'yı TwoDShape sınıfının bir sanal metodu yapmak çok daha iyi olabilir. Bu sayede, türetilmiş sınıfların her biri area()'yı devre dışı bırakabilir ve sınıf içinde belirtilen şeklin alanının nasıl hesaplandığını da tanımlayabilir. Aşağıdaki program bunu gerçekleştirir. Kolaylık sağlamak için TwoDShape'e ayrıca bir de isim özelliği eklenmektedir. (Bu, sınıfları göstermeyi kolaylaştırır.)

Devre dışı bırakılan metotlara neden gerek var? [12]

Devre dışı bırakılan metotlar, C#'ın çalışma zamanında gerekli olan çok biçimliliği desteklemesine olanak tanır. Çok biçimlilik nesne yönelimli programlama için gereklidir, çünkü çok biçimlilik bir yandan bir genel sınıfın tüm türevlerinde ortak olacak metotları belirtmeye olanak tanırken, öte yandan türetilmiş sınıflara da bu metotların bir kısmının ya da tümünün spesifik uygulamalarını tanımlamalarına imkan verir. Devre dışı bırakılan metotlar, C#'ın "tek arayüz, çok metot" çok biçimlilik özelliğini uygulamanın bir başka yoludur.
Çok biçimliliği başarıyla uygulamanın anahtarı bir ölçüde, temel ve türetilmiş sınıfların hiyerarşi içinde daha az uzmanlık alanından daha yoğun uzmanlık alanına doğru ilerlediğini kavramaktır. Doğru kullanıldığında bir temel sınıf, türetilmiş sınıfın direkt olarak kullanabileceği öğelerin tümünü sağlar. Ayrıca, türetilmiş sınıfın kendi başına uygulaması gereken metotları da tanımlar. Bu, türetilmiş sınıfa kendi metotlarını tanımlama esnekliği sunarken, aynı zamanda tutarlı bir arayüzü de mecbur kılmayı sürdürür. Böylece, kalıtımı devre dışı bırakılan metotlarla birleştirerek bir temel sınıf, tüm türetilmiş sınıfları tarafından kullanılacak olan metotların genel yapısını tanımlayabilir.

Kaynak: Herbert Schildt
Herkes için C#

Sanal Metotlar ve Devre Dışı Bırakma (Overriding) [11]

Sanal metot, temel sınıf içerisinde virtual olarak deklare edilen ve bir veya daha fazla türetilmiş sınıf içinde yeniden tanımlanan bir metotdur. Böylece, her türetilmiş sınıf bir sanal metodun kendine özgü bir versiyonuna sahip olabilir. Sanal metotlardan biri bir temel referansı tarafından çağrıldığında ortaya çıkan durum ilginçtir. Bu durumda, referans tarafından referansta bulunulan nesnenin tipine bağlı olarak c#, söz konusu metodun hangi versiyonunun çağrılacağını belirler ve bu belirleme çalışma zamanında gerçekleştirilir.
Yani, farklı nesnelere referansta bulunuluyorsa sanal metodun farklı versiyonları çalıştırılır. Bir başka deyişle, sanal metodun hangi versiyonunun çalıştırılacağını belirleyen referansta bulunan nesnenin tipidir. (referansın tipi değildir.) Dolayısıyla, eğer bir temel sınıf bir sanal metot içeriyorsa ve bu temel sınıftan başka sınıflar turetilmişse, bu durumda bir temel sınıf referansı aracılığıyla farklı nesne tiplerine referansta bulunulurken sanal metodun farklı versiyonları çalıştırılır.

Temel Sınıf Referansları ve Türetilmiş Nesneler [10]

Bildiğiniz gibi, C# veri tiplerine sıkı sıkıya bağlı bir dildir. Standart dönüşümler ve basit tiplere uygulanan otomatik terfiler bir yana, tip uyumluluğu kesinlikle zorlanır. Bu yüzden, bir sınıf tipindeki bir referans değişkeni normalde bir başka sınıf tipindeki nesneye referans bulunamaz. Örneğin, aşağıdaki programı ele alın:

// Bu program calismayacaktir.
class X {
int a;
public X(int i){ a=i; }
}
class Y {
int a;
public Y(int i) { a=i; }
}

class IncompatibleRef {
public static void Main() {
X x=new X(10);
X x2;
Y y=new Y(5);

x2=x; // OK, her ikiside ayni tipte
x2=y; // Hata, ayni tipte degiller
}
}