Sdílet prostřednictvím


Objekty (Příručka programování C#)

Definice třídy nebo struktury je o jakousi Určuje, jaký typ můžete provést.Objekt je v podstatě blok paměti, která byla přidělena a nakonfigurován podle plánu.Program může vytvořit mnoho objektů stejné třídy.Objekty se nazývají také instance a mohou být uloženy v pojmenované proměnné nebo pole nebo kolekce.Klientský kód je kód, který používá tyto proměnné volání metod a přístup k veřejné vlastnosti objektu.V objektově orientovaného jazyka jako jazyka C# typické program se skládá z více objektů, které dynamicky interakci.

[!POZNÁMKA]

Statické typy chovat odlišně, než co je zde popsáno.Další informace naleznete v tématu Statické třídy a členy statických tříd (Příručka programování C#).

Instance struct VS. instance třídy

Protože třídy jsou odkazové typy, proměnné třídy objektu obsahuje odkaz na adresu objektu na spravované haldě.Pokud první objekt přiřazena druhý objekt stejného typu, obě proměnné odkazují na objekt na této adrese.Tento bod je popsán podrobněji dále v tomto tématu.

Instance tříd, které jsou vytvořeny pomocí operátoru new.V následujícím příkladu Person je typ a person1 a person 2 jsou instance nebo objekty tohoto typu.

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);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();

    }
}
/*
    Output:
    person1 Name = Leopold Age = 6
    person2 Name = Molly Age = 16
    person1 Name = Molly Age = 16
*/

Protože struktury jsou hodnotové typy, proměnné objektu struct obsahuje kopii celého objektu.Pomocí lze také vytvořit instance struktur new operátor, ale není nutné, jak je znázorněno v následujícím příkladu:

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);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/*
  Output:
    p1 Name = Alex Age = 9
    p2 Name = Spencer Age = 7
    p1 Name = Alex Age = 9
*/

Paměť pro oba p1 a p2 je přidělený do zásobníku podprocesu.Že paměť je zažádáno s typ nebo metodu, která je deklarována.Toto je jeden z důvodů, proč jsou při přiřazení kopírovány struktur.Naopak paměti přidělené pro instanci třídy je automaticky regenerované (uvolňování) společný jazykový modul runtime při všechny odkazy na objekt mimo rozsah.Není možné deterministically zničení objektu třídy, jako v jazyce C++.Další informace o uvolňování paměti v .NET Framework, viz Uvolňování paměti.

[!POZNÁMKA]

V modulu CLR je vysoce optimalizována přidělování a navracení zpět paměti na spravované haldě.Ve většině případů je žádné významné rozdíly v nákladech na výkon přidělení haldy versus přidělování struct instance v zásobníku instance třídy.

Objekt Identity VS. hodnotu rovnosti

Při porovnávání rovnosti dvou objektů musí nejprve rozlišit, zda chcete vědět, zda představují dvě proměnné stejný objekt v paměti, nebo zda jsou ekvivalentní hodnoty jedné nebo více polí.Pokud mají v úmyslu porovnat hodnoty, je třeba zvážit, zda jsou objekty instancí typů hodnotu (struktur) nebo odkaz (tříd delegátů, matice).

  • Určit, zda dvě instance třídy odkazují na stejné místo v paměti (což znamená, že mají stejný identity), použít statickou Equals metoda.(System.Object je implicitní základní třída pro všechny hodnoty a odkazové typy, včetně uživatelem definovaných struktur a tříd.)

  • Chcete-li zjistit, zda instance pole dvě instance struktury mají stejné hodnoty, použijte ValueType.Equals metoda.Protože všechny struktur implicitně dědí z System.ValueType, volat metodu přímo na váš objekt, jak je znázorněno v následujícím příkladu:

Person p1 = new Person("Wallace", 75);
Person p2;
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 Provádění Equals používá reflexi, protože musí být možné určit pole jsou v jakékoli struct.Při vytváření vlastních struktur, přepsat Equals metody poskytují efektivní rovnosti algoritmus určitého typu.

Související oddíly

Další informace:

Viz také

Referenční dokumentace

objekt (C#-Reference)

Dědičnost (Příručka programování C#)

třídy (C#-Reference)

Struktura (C#-Reference)

nový operátor (C#-Reference)

Koncepty

Příručka programování C#

Specifikace CTS (Common Type System)