Object Sınıfı Nedir?
Bu yazımızda .NET Framework sınıflarının temel olarak kalıttığı ilk sınıf olan “object” sınıfını daha yakından inceleyeceğiz.
Tüm sınıfların temel aldığı .NET çatısının en tepesinde bulunan sınıfıdır. Bu tanımdan yola çıkarsak belkide Object sınıfının aslında herşey olduğunu kısaca “Object is Everthing” diyebiliriz. Bir nesnenin başlangıcıdır. Kalıtım (inheritance) yoluyla tüm sınıflarda Object sınıfına ait izler görebilirsiniz.
Object sınıfın sahip olduğu 5 farklı metoda sahiptir.
- GetType
- Equals
- ReferenceEquals
- ToString
- GetHashCode
Object sınıfı metodları
Metod | Açıklama |
GetType | Nesnenin veri türünü döndürür. |
Equals | İki nesne örneği arasında karşılaştırma yapar. Aynı nesneler karşılaştırıldığında true aksi halde false döndürür. |
ReferenceEquals | İki nesne örneği arasında karşılaştırma yapar. Aynı referans adreslerine sahip nesneler karşılaştırıldığında true aksi halde false döndürür. |
ToString | Nesneyi string tipine dönüştürür. |
GetHashCode | Nesnenin hashcode bilgisini verir. |
# .ToString()
Object değerini string türüne çevirir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
namespace ObjectClass { public class Isci { string _ad; public string Ad { get { return _ad; } set { _ad= value; } } string _soyad; public string Soyad { get { return _soyad; } set { _soyad= value; } } int _yas; public int Yas { get { return _yas; } set { _yas= value; } } string _id; public string Id { get { return _id; } set { _id= value; } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Program { static void Main(string[] args) { Isci isci1= new Isci(); isci1.Ad= "Hakan"; isci1.Soyad= "Tural"; isci1.Yas = 23; string s = isci1.ToString(); Console.WriteLine(s); } } |
Sonuç ekranı;
# .ToString() Metodunu Override Etmek
.NET içerisinde public virtual string ToString(); olarak tanımlanmış olan .ToString() metodu her virtual metod gibi override edilebilir.
Isci sınıfını aşağıdaki şekilde düzenleyiniz.
Isci.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class Isci { string _ad; public string Ad { get { return _ad; } set { _ad= value; } } string _soyad; public string Soyad { get { return _soyad; } set { _soyad= value; } } int _yas; public int Yas { get { return _yas; } set { _yas= value; } } string _id; public string Id { get { return _id; } set { _id= value; } } public override string ToString() { string s = "Adı: " + _ad+ " , " + " Soyadı: " + _soyad+ " , " + "Yaşı: " + _yas; return s; } } |
override edilen ToString() metodu böylelikle yeni bir davranışa sahip olmaktadır.
Sonuç;
# Equals() Method
Karşılaştırılan iki nesnenin aynı referansta olup olmadığını döndürür.
public virtual bool Equals(object obj);
Örnek:
1 2 3 4 5 6 7 |
Isci isci1 = new Isci(); isci1.Ad= "Hakan"; isci1.Soyad= "Tural"; isci1.Yas= 23 Isci isci2 = isci1; |
uygulama kodlarında son olarak isci1 ve isci2 nesneleri birbirine eşitlenmiş durumdadır. Referans türlerinde bu eşitlik sonucu her iki nesne aynı heap bellek bölgesini işaret edecektir. Kısaca nesneler birbirinin aynısıdır. Equals() metodu bu nesneler için “true” değerini döndürür.
1 2 3 |
isci1.Equals(isci2); |
Aşağıdaki senaryoda ise “ISci” tipinde isci3 ve isci4 nesneleri her ne kadar aynı durumlara (state) yada aynı özellik değerlerine sahip olsalarda farklı heap bellek bölgelerinde tutulduklarından “equals()” metodu bu iki nesne için false değerini döndürür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Isci isci3= new Isci(); isci3.Ad = "Suat"; isci3.Soyad= "Talas"; isci3.Yas= 23; isci3.Id= "123A"; Isci isci4= new Isci(); isci4.Ad= "Suat"; isci4.Soyad= "Talas"; isci4.Yas= 23; isci4.Id= "123A"; //False. isci3.Equals(isci4); |
# Equals Metodunu Override Etmek
Equals() metodunu biraz farklı yorumlayalım. Söz konusu nesnelerimizin referans eşitliğinden ziyade, nesnelerin eşit olup olmadıklarını değerlerine bakılarak yapılabilmesini sağlayalım. Bu durumda “Employee” sınıfında “Equals()” metodunu override ederek farklı davranışa göre programlayalım.
Sınıfları aşağıdaki gibi düzenleyiniz.
Employee.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Overriding Equals() method public override bool Equals(object obj) { if (obj != null && obj is Isci) { Isci isci = (Isci)obj; if (isci.Ad== this.Ad&& isci.Soyad== this.Soyad&& isci.Id== this.Id) return true; } return false; } |
Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Isci isci1= new Isci(); isci1.Ad= "Suat"; isci1.Soyad= "Talas"; isci1.Yas= 23; isci1.Id= "123A"; Isci isci2= new Isci(); isci2.Ad= "Suat"; isci2.Soyad = "Talas"; isci2.Yas= 23; isci2.Id= "123A"; //True. isci1.Equals(isci2); |
Sonuç olarak “Equals()” metodu “True” değerini döndürür.
# GetHashCode() Method
Nesnenin referans bilgisini sayısal bilgi olarak verir.
public virtual int GetHashCode();
Farklı iki nesnenin sahip olduğu hashcode aşağıdaki örnekte gösterilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Isci isci1= new Isci(); isci1.Ad= "Suat"; isci1.Soyad= "Talas"; isci1.Yas= 23; isci1.Id= "125"; Isci isci2= new Isci(); isci2.Ad= "Behic"; isci2.Soyad= "Ozkan"; isci2.Yas= 23; isci2.Id= "125"; Console.WriteLine("isci 1 hash code: {0}", isci1.GetHashCode()); Console.WriteLine("isci 2 hash code: {0}", isci2.GetHashCode()); |
Ancak nesneler birbirine eşitlendiğinde sahip olduğu hashcode birbirine eşit olur. Örneğin;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Isci isci1= new Isci(); isci1.Ad= "Suat"; isci1.Soyad= "Talas"; isci1.Yas= 23; isci1.Id= "125"; Isci isci2= new Isci(); isci2=isci1; Console.WriteLine("isci 1 hash code: {0}", isci1.GetHashCode()); Console.WriteLine("isci 2 hash code: {0}", isci2.GetHashCode()); |
# GetType()
Objenin tür bilgisini verir.
public Type GetType();
Örneklerimizde kullandığımız “isci” nesnelerinin türünü çalışma zamanında öğrenmek istersek;
1 2 3 4 5 6 7 8 9 |
Isci isci1 = new Isci(); isci1.Ad= "Suat"; isci1.Soyad= "Talas"; isci1.Yas= 23; isci1.Id= "125"; Console.WriteLine(isci1.GetType()); |
Çalışma Örneği:
Örneğimizde iki boyutlu bir noktanın sınıf tasarımını gerçekleştirelim.
Nokta.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System; class Nokta { public int x, y; public Nokta(int x, int y) { this.x = x; this.y = y; } public override bool Equals(object obj) { // Tür kontrolü sonucu farklı türlerde ise false döndürsün. if (obj.GetType() != this.GetType()) return false; // Eğer sahip oldukları özellik bilgileri eşitse nesneleri eşit kabul etsin. Nokta deger = (Nokta) obj; return (this.x == deger.x) && (this.y == deger.y); } // x ve y değerlerinin XOR işleminden geçirildiği sonuç hashcode olarak döndürülsün public override int GetHashCode() { return x ^ y; } // Noktanın x ve y değerleri string bilgi olarak versin. public override String ToString() { return String.Format("({0}, {1})", x, y); } // Objenin basit bir kopyasını versin. public Nokta Copy() { return (Nokta) this.MemberwiseClone(); } } |
Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public sealed class App { static void Main() { // Point tipinde bir nokta nesnesi örneklensin. Nokta p1 = new Nokta(1,2); // Diğer bir nokta olan p2 nesnesi p1'in kopyasını taşısın. Nokta p2 = p1.Copy(); // p3 noktası p1 ile aynı referansı göstersin. Nokta p3 = p1; Console.WriteLine(Object.ReferenceEquals(p1, p2)); Console.WriteLine(Object.Equals(p1, p2)); Console.WriteLine(Object.ReferenceEquals(p1, p3)); Console.WriteLine("p1'in değeri: {0}", p1.ToString()); } } |
Program çıktısı aşağıdaki sonucu verecektir. Sonuçlar açısından programı tekrar inceleyiniz.