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.

Not

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 işleci kullanılarak new oluşturulur. Aşağıdaki örnekte, Person ve person1 person2 türü ve 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 = {0} Age = {1}", person1.Name, 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 = {0} Age = {1}", person2.Name, person2.Age);
        Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, 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ı örnekleri işleci kullanılarak new 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 = {0} Age = {1}", p1.Name, 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 = {0} Age = {1}", p2.Name, p2.Age);

            // p1 values remain unchanged because p2 is  copy.
            Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);
        }
    }
    /*
        Output:
        p1 Name = Alex Age = 9
        p2 Name = Spencer Age = 7
        p1 Name = Alex Age = 9
    */
}

hem hem p2 de p1 için bellek, iş parçacığı yığınında ayrılır. 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ı tarafından otomatik olarak geri kazanılı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.

Not

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 (aynı kimliğe 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 yöntemini kullanın ValueType.Equals . Tüm yapılar örtük olarak öğesinden System.ValueTypedevraldığı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 uygulaması Equals bazı durumlarda kutulama ve yansıma kullanır. Türünüze özgü verimli bir eşitlik algoritması sağlama hakkında bilgi için bkz . 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 yöntemini veya == işlecini kullanabilirsinizEquals. 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ı arabirimini IEquatable<T> veya arabirimini IEqualityComparer<T> de uygulayabilir. Her iki arabirim de değer eşitliğini test etmek için kullanılabilecek yöntemler sağlar. geçersiz kılan Equalskendi sınıflarınızı tasarlarken ve Object.Equals(Object)türü için değer eşitliğini tanımlama konusunda belirtilen yönergeleri izlediğinizden emin olun.

Daha fazla bilgi için: