Aracılığıyla paylaş


Nesneler - tür örnekleri oluşturma

Sınıf veya yapı tanımı, türün neler yapabileceğini belirten bir şema gibidir. Nesne temelde şemaya göre ayrılmış ve yapılandırılmış bir bellek bloğudur. Bir program aynı sınıfta birçok nesne oluşturabilir. Nesneler örnek olarak da adlandırılır ve adlandırılmış değişkende ya da dizide ya da koleksiyonda depolanabilir. İstemci kodu, yöntemleri çağırmak ve nesnenin genel özelliklerine erişmek için bu değişkenleri kullanan koddur. C# gibi nesne odaklı bir dilde, tipik bir program dinamik olarak etkileşim kuran birden çok nesneden oluşur.

Uyarı

Statik türler burada 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 atanırsa, her iki değişken de bu adreste nesneye başvurur. Bu nokta, bu makalenin devamında daha ayrıntılı olarak ele alınmalıdır.

Sınıf örnekleri, new işleci kullanılarak oluşturulur. Aşağıdaki örnekte, Person türü ve person1 ve person2 bu türdeki örnekler veya nesnelerdir.

using System;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    // Other properties, methods, events...
}

class Program
{
    static void Main()
    {
        Person person1 = new Person("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. Yapıların örnekleri new işleci kullanılarak da oluşturulabilir, ancak aşağıdaki örnekte gösterildiği gibi bu gerekli değildir:

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 Person("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
    */
}

p1 ve p2 için bellek, iş parçacığı yığınında tahsis edilmiştir. Bu bellek, bildirildiği tür veya yöntemle birlikte geri kazanılır. Bu, yapıların atamada kopyalanmış olmasının bir nedenidir. Buna karşılık, bir sınıf örneği için ayrılan bellek, nesneye yapılan tüm başvurular kapsam dışına çıktığında ortak dil çalışma zamanı sistemi tarafından otomatik olarak geri alınır (çöp toplanır). C++ içinde yapabileceğiniz gibi bir sınıf nesnesinin belirlenerek yok edilmesi mümkün değildir. .NET'te çöp toplama hakkında daha fazla bilgi için bkz. Çöp Toplama.

Uyarı

Yönetilen yığındaki belleğin ayrılması ve serbest bırakılması, ortak dil çalışma zamanında yüksek oranda iyileştirilmiştir. Çoğu durumda yığındaki bir sınıf örneğini ayırmanın performans maliyeti ile yığındaki bir 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ğinizi ayırt etmeniz gerekir. Değerleri karşılaştırmayı planlıyorsanı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 bulundurmanız gerekir.

  • İki sınıf örneğinin bellekte aynı konuma başvurup başvurmadığını belirlemek için (yani aynıkimliğine sahip oldukları anlamına gelir), statik Object.Equals 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.)

  • İki yapı örneğindeki örnek alanlarının aynı değerlere sahip olup olmadığını belirlemek için ValueType.Equals yöntemini kullanın. 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
    //{
    //    public string Name;
    //    public int Age;
    //    public Person(string name, int age)
    //    {
    //        Name = name;
    //        Age = age;
    //    }
    //}
    
    Person p1 = new Person("Wallace", 75);
    Person p2 = new Person("", 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.
    

    System.ValueType Equals uygulaması bazı durumlarda kutulama ve yansıma kullanır. Türünüzle ilgili verimli bir eşitlik algoritması sağlama hakkında bilgi için bkz. bir tür için değer eşitliğini tanımlama. 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. Equalsgeçersiz kılan kendi sınıflarınızı tasarlarken, Bir tür ve Object.Equals(Object)için değer eşitliğini tanımlama bölümünde belirtilen yönergeleri izlediğinizden emin olun.

Daha fazla bilgi için: