Udostępnij za pośrednictwem


Obiekty (Przewodnik programowania w języku C#)

Definicja klasy lub struktury jest jak plan, który określa, co można zrobić typu.Obiekt jest w zasadzie bloku pamięci przydzielone i skonfigurowany zgodnie z plan.Program może utworzyć wiele obiektów w tej samej klasy.Obiekty są również nazywane wystąpień i mogą być przechowywane w nazwie zmiennej lub w tablicy lub kolekcji.Kod klienta jest kod, który używa tych zmiennych do wywoływania metody i uzyskać dostęp do publicznych właściwości obiektu.W zorientowany obiektowo język takich jak C# typowy program składa się z wielu obiektów interakcji dynamicznie.

[!UWAGA]

Typy statyczne zachowywać się inaczej, niż to, co jest opisane w tym miejscu.Aby uzyskać więcej informacji, zobacz Klasy statyczne i statyczni członkowie klas (Przewodnik programowania w języku C#).

Struct wystąpień VS. wystąpień klasy

Ponieważ klasy są typy odwołań, zmiennej obiektu klasy posiada odwołanie do adresu obiektu na stercie zarządzanych.Jeśli drugi obiekt tego samego typu jest przypisany do pierwszego obiektu, zarówno zmienne odnoszą się do obiektu pod tym adresem.Ten punkt jest omówione bardziej szczegółowo w dalszej części tego tematu.

Wystąpienia klas są tworzone za pomocą operatora new.W poniższym przykładzie Person jest typem i person1 i person 2 są wystąpienia lub obiektów tego 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
*/

Ponieważ strukturach typy wartości, zmiennej obiektu struct przechowuje kopię całego obiektu.Wystąpienia strukturach można także tworzyć za pomocą new operatora, ale nie jest wymagane, jak pokazano w poniższym przykładzie:

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
*/

Pamięć dla obu p1 i p2 jest przydzielane na stosie wątku.Że pamięć jest odzyskane oraz typ lub metoda, w której jest zadeklarowana.Jest to jeden z powodów dlaczego strukturach są kopiowane w przydziale.Natomiast pamięci, która jest przydzielona dla wystąpienia klasy jest automatycznie regeneracji (czyszczenie pamięci) przez aparat plików wykonywalnych języka wspólnego, gdy wszystkie odwołania do obiektu już się poza zakresem.Nie jest możliwe, deterministically zniszczenie obiektu klasy, jak również w języku C++.Aby uzyskać więcej informacji na temat kolekcji garbage w .NET Framework, zobacz Wyrzucanie elementów bezużytecznych.

[!UWAGA]

W common language runtime optymalizowana jest alokacji i dezalokacji pamięci na stercie zarządzanych.W większości przypadków jest znaczącej różnicy w wydajności kosztów alokacji na stercie w porównaniu do przydzielania wystąpienie struct na stosie wystąpienia klasy.

Obiekt tożsamości VS. wartość równości

Podczas porównywania dwóch obiektów dla równości, najpierw należy odróżnić czy chcesz wiedzieć, czy dwie zmienne reprezentują ten sam obiekt w pamięci, albo czy wartości jednej lub kilku polach są równoważne.Jeśli masz zamiar porównywania wartości, należy rozważyć, czy obiekty są wystąpień typów wartości (strukturach) lub typy odwołań (klas, delegatów, tablice).

  • Aby ustalić, czy dwa wystąpienia klasy odnoszą się do tej samej lokalizacji w pamięci (co oznacza, że mają takie same tożsamości), Użyj statycznego Equals metoda.(Object jest niejawna klasa podstawowa dla wszystkich typów wartości i typy referencyjne, w tym klas i strukturach użytkownika.)

  • Aby określić, czy pola wystąpienia w dwóch przypadkach struct mają te same wartości, należy użyć ValueType.Equals metoda.Ponieważ strukturami niejawnie dziedziczą z ValueType, wywołanie metody bezpośrednio na obiekcie, jak pokazano w poniższym przykładzie:

// 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;
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.

ValueType Wykonania Equals korzysta z odbiciem, ponieważ musi być w stanie ustalić, jakie pola są wszelkie struct.Podczas tworzenia własnych strukturach, zastąpić Equals metodę w celu zapewnienia algorytm efektywne równości, specyficzne dla danego typu.

Sekcje pokrewne

Aby uzyskać więcej informacji:

Zobacz też

Informacje

object (odwołanie w C#)

Dziedziczenie (Przewodnik programowania w języku C#)

class (odwołanie w C#)

struct (odwołanie w C#)

new — Operator (odwołanie w C#)

Koncepcje

Przewodnik programowania w języku C#

System typu wspólnego