Klasy i struktury (Przewodnik programowania w języku C#)Classes and Structs (C# Programming Guide)

Klasy i struktury są dwoma podstawowymi konstrukcjami systemu wspólnego typu w .NET Framework.Classes and structs are two of the basic constructs of the common type system in the .NET Framework. Każda z nich jest zasadniczo strukturą danych, która hermetyzuje zestaw danych i zachowań, które należą do jednostki logicznej.Each is essentially a data structure that encapsulates a set of data and behaviors that belong together as a logical unit. Dane i zachowania są elementami członkowskimi klasy lub struktury, a także zawierają metody, właściwości i zdarzenia itd., jak opisano w dalszej części tego tematu.The data and behaviors are the members of the class or struct, and they include its methods, properties, and events, and so on, as listed later in this topic.

Deklaracja klasy lub struktury jest taka sama jak plan, który jest używany do tworzenia wystąpień lub obiektów w czasie wykonywania.A class or struct declaration is like a blueprint that is used to create instances or objects at run time. Jeśli zdefiniujesz klasę lub strukturę o nazwie Person, Person jest nazwą typu.If you define a class or struct called Person, Person is the name of the type. Jeśli zadeklarujesz i zainicjujesz p zmienną Persontypu p , Personmówi się, że jest obiektem lub wystąpieniem.If you declare and initialize a variable p of type Person, p is said to be an object or instance of Person. Można utworzyć wiele wystąpień tego Person samego typu, a każde wystąpienie może mieć różne wartości w jego właściwościach i polach.Multiple instances of the same Person type can be created, and each instance can have different values in its properties and fields.

Klasa jest typem referencyjnym.A class is a reference type. Po utworzeniu obiektu klasy zmienna, do której przypisany jest obiekt, zawiera tylko odwołanie do tej pamięci.When an object of the class is created, the variable to which the object is assigned holds only a reference to that memory. Gdy odwołanie do obiektu jest przypisane do nowej zmiennej, Nowa zmienna odwołuje się do oryginalnego obiektu.When the object reference is assigned to a new variable, the new variable refers to the original object. Zmiany wprowadzone za pomocą jednej zmiennej są odzwierciedlane w innej zmiennej, ponieważ odwołują się do tych samych danych.Changes made through one variable are reflected in the other variable because they both refer to the same data.

Struktura jest typem wartości.A struct is a value type. Po utworzeniu struktury zmienna, do której jest przypisana struktura, zawiera rzeczywiste dane struktury.When a struct is created, the variable to which the struct is assigned holds the struct's actual data. Gdy struktura jest przypisana do nowej zmiennej, zostanie ona skopiowana.When the struct is assigned to a new variable, it is copied. Nowa zmienna i oryginalna zmienna w związku z tym zawierają dwie oddzielne kopie tych samych danych.The new variable and the original variable therefore contain two separate copies of the same data. Zmiany wprowadzone w jednej kopii nie mają wpływu na inną kopię.Changes made to one copy do not affect the other copy.

Ogólnie rzecz biorąc, klasy są używane do modelowania bardziej złożonej zachowań lub dane, które mają być modyfikowane po utworzeniu obiektu klasy.In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. Struktury są najlepiej dostosowane do małych struktur danych, które zawierają głównie dane, które nie są przeznaczone do modyfikacji po utworzeniu struktury.Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created.

Aby uzyskać więcej informacji, zobacz klasy, obiektyi struktury.For more information, see Classes, Objects, and Structs.

PrzykładExample

W CustomClass poniższym przykładzie ProgrammingGuide w przestrzeni nazw znajdują się trzy elementy członkowskie: Konstruktor wystąpienia, właściwość o nazwie Numberi metoda o nazwie. MultiplyIn the following example, CustomClass in the ProgrammingGuide namespace has three members: an instance constructor, a property named Number, and a method named Multiply. Metoda w klasie tworzyCustomClasswystąpienie (obiekt), a metoda i właściwość obiektu są dostępne przy użyciu notacji Programkropkowej. MainThe Main method in the Program class creates an instance (object) of CustomClass, and the object’s method and property are accessed by using dot notation.

using System;

namespace ProgrammingGuide
{
   // Class definition.
   public class CustomClass
   {
      // Class members.
      //
      // Property.
      public int Number { get; set; }

      // Method.
      public int Multiply(int num)
      {
          return num * Number;
      }

      // Instance Constructor.
      public CustomClass()
      {
          Number = 0;
      }
   }

   // Another class definition that contains Main, the program entry point.
   class Program
   {
      static void Main(string[] args)
      {
         // Create an object of type CustomClass.
         CustomClass custClass = new CustomClass();

         // Set the value of the public property.
         custClass.Number = 27;

         // Call the public method.
         int result = custClass.Multiply(4);
         Console.WriteLine($"The result is {result}.");
      }
   }
}
// The example displays the following output:
//      The result is 108. 

EncapsulationEncapsulation

Hermetyzacja jest czasami określana jako pierwszy filar lub zasada programowania zorientowanego obiektowo.Encapsulation is sometimes referred to as the first pillar or principle of object-oriented programming. Zgodnie z zasadą hermetyzacji, Klasa lub struktura może określać, jak dostępne są poszczególne elementy członkowskie w kodzie poza klasą lub strukturą.According to the principle of encapsulation, a class or struct can specify how accessible each of its members is to code outside of the class or struct. Metody i zmienne, które nie są przeznaczone do użycia poza klasą lub zestawem, mogą być ukryte, aby ograniczyć liczbę błędów lub złośliwych luk w zabezpieczeniach.Methods and variables that are not intended to be used from outside of the class or assembly can be hidden to limit the potential for coding errors or malicious exploits.

Aby uzyskać więcej informacji na temat klas, zobacz klasy i obiekty.For more information about classes, see Classes and Objects.

Elementy członkowskieMembers

Wszystkie metody, pola, stałe, właściwości i zdarzenia muszą być zadeklarowane w obrębie typu; są one nazywane elementami członkowskimi typu.All methods, fields, constants, properties, and events must be declared within a type; these are called the members of the type. W C#programie nie istnieją zmienne globalne ani metody, które są w innych językach.In C#, there are no global variables or methods as there are in some other languages. Nawet punkt wejścia programu, Main Metoda musi być zadeklarowana w obrębie klasy lub struktury.Even a program's entry point, the Main method, must be declared within a class or struct. Poniższa lista zawiera wszystkie różne rodzaje elementów członkowskich, które mogą być zadeklarowane w klasie lub strukturze.The following list includes all the various kinds of members that may be declared in a class or struct.

Ułatwienia dostępuAccessibility

Niektóre metody i właściwości mają być wywoływane lub dostępne z kodu poza klasą lub strukturą, znaną jako kod klienta.Some methods and properties are meant to be called or accessed from code outside your class or struct, known as client code. Inne metody i właściwości mogą być używane tylko w samej klasie lub strukturze.Other methods and properties might be only for use in the class or struct itself. Ważne jest, aby ograniczyć dostępność kodu, tak aby można było uzyskać do niego tylko kod zamierzonego klienta.It is important to limit the accessibility of your code so that only the intended client code can reach it. Możesz określić, jak dostępne typy i ich elementy członkowskie mają być kodem klienta przy użyciu modyfikatorów dostępu Public, Protected, Internal, protected internal, Private i Private.You specify how accessible your types and their members are to client code by using the access modifiers public, protected, internal, protected internal, private and private protected. Domyślna dostępność to private.The default accessibility is private. Aby uzyskać więcej informacji, zobacz Modyfikatory dostępu.For more information, see Access Modifiers.

DziedziczenieInheritance

Klasy (ale nie struktury) obsługują koncepcję dziedziczenia.Classes (but not structs) support the concept of inheritance. Klasa, która dziedziczy z innej klasy ( Klasa bazowa), automatycznie zawiera wszystkie publiczne, chronione i wewnętrzne elementy członkowskie klasy podstawowej, z wyjątkiem konstruktorów i finalizatorów.A class that derives from another class (the base class) automatically contains all the public, protected, and internal members of the base class except its constructors and finalizers. Aby uzyskać więcej informacji, zobacz Dziedziczenie i polimorfizm.For more information, see Inheritance and Polymorphism.

Klasy mogą być deklarowane jako abstrakcyjne, co oznacza, że co najmniej jedna z tych metod nie ma implementacji.Classes may be declared as abstract, which means that one or more of their methods have no implementation. Chociaż klasy abstrakcyjne nie mogą być tworzone bezpośrednio, mogą służyć jako klasy bazowe dla innych klas, które zapewniają brakującą implementację.Although abstract classes cannot be instantiated directly, they can serve as base classes for other classes that provide the missing implementation. Klasy mogą być również zadeklarowane jako zapieczętowane , aby uniemożliwić innym klasom dziedziczenie z nich.Classes can also be declared as sealed to prevent other classes from inheriting from them. Aby uzyskać więcej informacji, zobacz klasy abstrakcyjne i zapieczętowane oraz składowe klas.For more information, see Abstract and Sealed Classes and Class Members.

InterfejsyInterfaces

Klasy i struktury mogą dziedziczyć wiele interfejsów.Classes and structs can inherit multiple interfaces. Aby dziedziczyć z interfejsu, oznacza, że typ implementuje wszystkie metody zdefiniowane w interfejsie.To inherit from an interface means that the type implements all the methods defined in the interface. Więcej informacji znajdziesz w artykule Interfejsy.For more information, see Interfaces.

Typy ogólneGeneric Types

Klasy i struktury można definiować przy użyciu co najmniej jednego parametru typu.Classes and structs can be defined with one or more type parameters. Kod klienta dostarcza typ podczas tworzenia wystąpienia typu.Client code supplies the type when it creates an instance of the type. Na przykład List<T> Klasa System.Collections.Generic w przestrzeni nazw jest zdefiniowana z jednym parametrem typu.For example The List<T> class in the System.Collections.Generic namespace is defined with one type parameter. Kod klienta tworzy wystąpienie List<string> obiektu lub List<int> , aby określić typ, który będzie przechowywany na liście.Client code creates an instance of a List<string> or List<int> to specify the type that the list will hold. Aby uzyskać więcej informacji, zobacz Ogólne.For more information, see Generics.

Typy statyczneStatic Types

Klasy (ale nie struktury) mogą być deklarowane jako statyczne.Classes (but not structs) can be declared as static. Klasa statyczna może zawierać tylko statyczne elementy członkowskie i nie można utworzyć wystąpienia z nowym słowem kluczowym.A static class can contain only static members and cannot be instantiated with the new keyword. Jedna kopia klasy jest ładowana do pamięci podczas ładowania programu, a jej elementy członkowskie są dostępne za pomocą nazwy klasy.One copy of the class is loaded into memory when the program loads, and its members are accessed through the class name. Obie klasy i struktury mogą zawierać statyczne składowe.Both classes and structs can contain static members. Aby uzyskać więcej informacji, zobacz klasy statyczne i statyczne elementy członkowskie klas.For more information, see Static Classes and Static Class Members.

Zagnieżdżone typyNested Types

Klasa lub struktura może być zagnieżdżona w innej klasie lub strukturze.A class or struct can be nested within another class or struct. Aby uzyskać więcej informacji, zobacz Typy zagnieżdżone.For more information, see Nested Types.

Typy częściowePartial Types

Można zdefiniować część klasy, struktury lub metody w jednym pliku kodu i innej części w osobnym pliku kodu.You can define part of a class, struct or method in one code file and another part in a separate code file. Aby uzyskać więcej informacji, zobacz częściowe klasy i metody.For more information, see Partial Classes and Methods.

Inicjatory obiektówObject Initializers

Można tworzyć wystąpienia i inicjować obiekty klasy lub struktury oraz kolekcje obiektów, bez jawnego wywołania konstruktora.You can instantiate and initialize class or struct objects, and collections of objects, without explicitly calling their constructor. Aby uzyskać więcej informacji, zobacz Inicjatory obiektów i kolekcji.For more information, see Object and Collection Initializers.

Typy anonimoweAnonymous Types

W sytuacjach, gdy nie jest to wygodne ani konieczne do utworzenia nazwanej klasy, na przykład podczas wypełniania listy strukturami danych, które nie muszą być utrwalane lub przekazywane do innej metody, używasz typów anonimowych.In situations where it is not convenient or necessary to create a named class, for example when you are populating a list with data structures that you do not have to persist or pass to another method, you use anonymous types. Aby uzyskać więcej informacji, zobacz Typy anonimowe.For more information, see Anonymous Types.

Metody rozszerzeńExtension Methods

Można "zwiększyć" klasy bez tworzenia klasy pochodnej przez utworzenie oddzielnego typu, którego metody mogą być wywoływane tak, jakby należały do oryginalnego typu.You can "extend" a class without creating a derived class by creating a separate type whose methods can be called as if they belonged to the original type. Aby uzyskać więcej informacji, zobacz metody rozszerzenia.For more information, see Extension Methods.

Jawnie wpisana zmienna lokalnaImplicitly Typed Local Variables

W ramach metody klasy lub struktury można użyć niejawnego wpisywania, aby nakazać kompilatorowi określenie poprawnego typu w czasie kompilacji.Within a class or struct method, you can use implicit typing to instruct the compiler to determine the correct type at compile time. Aby uzyskać więcej informacji, zobacz niejawnie wpisane zmienne lokalne.For more information, see Implicitly Typed Local Variables.

Specyfikacja języka C#C# Language Specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also