Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sınıf veya yapı tanımı, türün neler yapabileceğini belirten bir şema gibidir. Nesne, programın şemaya göre ayırıp yapılandıran bir bellek bloğudur. Bir program aynı sınıfta birçok nesne oluşturabilir. Nesne örneklerini de çağırabilirsiniz. Bunları adlandırılmış bir değişkende veya bir dizide veya koleksiyonda depolayabilirsiniz. İstemci kodu, yöntemleri çağırmak ve nesnenin genel özelliklerine erişmek için bu değişkenleri kullanır. C# gibi nesne odaklı bir dilde, tipik bir program dinamik olarak etkileşim kuran birden çok nesneden oluşur.
Uyarı
Statik türler bu makalede açıklanandan farklı davranır. Daha fazla bilgi için bkz . Statik Sınıflar ve Statik Sınıf Üyeleri.
Yapı örnekleri ile sınıf örnekleri karşılaştırması
Sınıflar başvuru türleri olduğundan, bir sınıf nesnesinin değişkeni yönetilen yığındaki nesnenin adresine başvuru içerir. İlk değişkene aynı türde ikinci bir değişken atarsanız, her iki değişken de bu adreste nesneye başvurur. Bu makalede bu nokta daha sonra daha ayrıntılı olarak ele alınmaktadır.
işlecini kullanarak sınıfların newörneklerini oluşturursunuz. Aşağıdaki örnekte, Person türü ve person1 ve person2 bu türdeki örnekler veya nesnelerdir.
using System;
public class Person(string name, int age)
{
public string Name { get; set; } = name;
public int Age { get; set; } = age;
// Other properties, methods, events...
}
class Program
{
static void Main()
{
Person person1 = new("Leopold", 6);
Console.WriteLine($"person1 Name = {person1.Name} Age = {person1.Age}");
// Declare new person, assign person1 to it.
Person person2 = person1;
// Change the name of person2, and person1 also changes.
person2.Name = "Molly";
person2.Age = 16;
Console.WriteLine($"person2 Name = {person2.Name} Age = {person2.Age}");
Console.WriteLine($"person1 Name = {person1.Name} Age = {person1.Age}");
/*
Output:
person1 Name = Leopold Age = 6
person2 Name = Molly Age = 16
person1 Name = Molly Age = 16
*/
}
}
Yapılar değer türleri olduğundan, yapı nesnesinin değişkeni nesnenin tamamının bir kopyasını tutar. Ayrıca işlecini new kullanarak yapıların örneklerini de oluşturabilirsiniz, ancak aşağıdaki örnekte gösterildiği gibi bunu kullanmanız gerekmez:
using System;
namespace Example
{
public struct Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
public class Application
{
static void Main()
{
// Create struct instance and initialize by using "new".
// Memory is allocated on thread stack.
Person p1 = new("Alex", 9);
Console.WriteLine($"p1 Name = {p1.Name} Age = {p1.Age}");
// Create new struct object. Note that struct can be initialized
// without using "new".
Person p2 = p1;
// Assign values to p2 members.
p2.Name = "Spencer";
p2.Age = 7;
Console.WriteLine($"p2 Name = {p2.Name} Age = {p2.Age}");
// p1 values remain unchanged because p2 is copy.
Console.WriteLine($"p1 Name = {p1.Name} Age = {p1.Age}");
}
}
/*
Output:
p1 Name = Alex Age = 9
p2 Name = Spencer Age = 7
p1 Name = Alex Age = 9
*/
}
İş parçacığı yığını, hem p1 hem de p2 için bellek ayırır. Program, bu belleği bildirdiğiniz tür veya yöntemle birlikte geri alır. Bu bellek yönetimi, yapıların atamada kopyalanmış olmasının bir nedenidir. Buna karşılık, ortak dil çalışma zamanı nesneye yapılan tüm başvurular kapsam dışına çıktığında sınıf örneği için ayırdığı belleği otomatik olarak geri alır (çöp toplar). C++'ta yapabildiğiniz gibi bir sınıf nesnesini deterministik olarak yok edemezsiniz. .NET'te çöp toplama hakkında daha fazla bilgi için bkz. Çöp Toplama.
Uyarı
Common Language Runtime, yönetilen yığın üzerindeki bellek ayırma ve serbest bırakma işlemlerini büyük ölçüde eniyiler. Çoğu durumda yığında bir sınıf örneğini ayırmanın performans maliyeti ile yığındaki yapı örneğini ayırma arasında önemli bir fark yoktur.
Nesne kimliği ile değer eşitliği karşılaştırması
Eşitlik için iki nesneyi karşılaştırdığınızda, önce iki değişkenin bellekte aynı nesneyi temsil edip etmediğini veya bir veya daha fazla alanın değerlerinin eşdeğer olup olmadığını bilmek isteyip istemediğinize karar verin. Değerleri karşılaştırmak istiyorsanız, nesnelerin değer türlerinin (yapılar) veya başvuru türlerinin (sınıflar, temsilciler, diziler) örnekleri olup olmadığını göz önünde bulundurun.
İki sınıf örneğinin bellekte aynı konuma başvurup başvurmadığını (yani aynı kimliğe sahip oldukları anlamına gelir) belirlemek için statik Object.ReferenceEquals yöntemini kullanın. (System.Object, kullanıcı tanımlı yapılar ve sınıflar dahil olmak üzere tüm değer türleri ve başvuru türleri için örtük temel sınıftır.)
Varsayılan olarak yöntemi, ValueType.Equals iki yapı örneğindeki örnek alanlarının aynı değerlere sahip olup olmadığını belirler. Tüm yapılar System.ValueType'den örtük olarak devraldığından, aşağıdaki örnekte gösterildiği gibi yöntemini doğrudan nesnenizde çağırırsınız:
// Person is defined in the previous example. //public struct Person(string name, int age) //{ // public string Name { get; set; } = name; // public int Age { get; set; } = age; //} Person p1 = new("Wallace", 75); Person p2 = new("", 42); p2.Name = "Wallace"; p2.Age = 75; if (p2.Equals(p1)) Console.WriteLine("p2 and p1 have the same values."); // Output: p2 and p1 have the same values.varsayılan System.ValueType uygulaması
Equalsbazı durumlarda kutulama ve yansıma kullanır. Türünüze özgü verimli bir eşitlik algoritmasını nasıl sağlayacağınız hakkında bilgi için bkz: Bir tür kayıt olamadığında eşitliği kendiniz uygulayın. Kayıtlar, eşitlik için değer semantiği kullanan başvuru türleridir.İki sınıf örneğindeki alanların değerlerinin eşit olup olmadığını belirlemek için Equals yöntemini veya == işlecinikullanabilirsiniz. Ancak, yalnızca sınıfı bu türdeki nesneler için "eşitliğin" ne anlama geldiğini gösteren özel bir tanım sağlamak üzere bunları geçersiz kıldıysa veya aşırı yüklediyse kullanın. sınıfı, IEquatable<T> arabirimini veya IEqualityComparer<T> arabirimini de uygulayabilir. Her iki arabirim de değer eşitliğini test etmek için kullanılabilecek yöntemler sağlar.
Equalsöğesini geçersiz kılan kendi sınıflarınızı tasarlarken, bir tür kayıt olamadığında eşitliği kendiniz uygulayın adlı Object.Equals(Object) ve içinde belirtilen yönergeleri izlediğinizden emin olun.
İlgili bölümler
Daha fazla bilgi için bakınız: