Classes e structs (Guia de Programação em C#)Classes and Structs (C# Programming Guide)

Classes e structs são duas das construções básicas do Common Type System no .NET Framework.Classes and structs are two of the basic constructs of the common type system in the .NET Framework. Cada um é, essencialmente, uma estrutura de dados que encapsula um conjunto de dados e os comportamentos que são uma unidade lógica.Each is essentially a data structure that encapsulates a set of data and behaviors that belong together as a logical unit. Os dados e os comportamentos são os membros da classe ou struct, e eles incluem seus métodos, propriedades e eventos, e etc., conforme listado neste tópico.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.

Uma declaração de classe ou struct é como um plano que é usado para criar instâncias ou objetos em tempo de execução.A class or struct declaration is like a blueprint that is used to create instances or objects at run time. Se você definir uma classe ou struct chamado Person, Person será o nome do tipo.If you define a class or struct called Person, Person is the name of the type. Se você declarar e inicializar um p variável do tipo Person, p será considerado um objeto ou uma instância de Person.If you declare and initialize a variable p of type Person, p is said to be an object or instance of Person. Várias instâncias do mesmo tipo Person podem ser criadas, e cada instância pode ter valores diferentes em suas propriedades e campos.Multiple instances of the same Person type can be created, and each instance can have different values in its properties and fields.

Uma classe é um tipo de referência.A class is a reference type. Quando um objeto da classe é criado, a variável à qual o objeto é atribuído armazena apenas uma referência na memória.When an object of the class is created, the variable to which the object is assigned holds only a reference to that memory. Quando a referência de objeto é atribuída a uma nova variável, a nova variável refere-se ao objeto original.When the object reference is assigned to a new variable, the new variable refers to the original object. As alterações feitas por meio de uma variável são refletidas na outra variável porque ambas se referem aos mesmos dados.Changes made through one variable are reflected in the other variable because they both refer to the same data.

Um struct é um tipo de valor.A struct is a value type. Quando um struct é criado, a variável à qual o struct está atribuído contém os dados reais do struct.When a struct is created, the variable to which the struct is assigned holds the struct's actual data. Quando o struct é atribuído a uma nova variável, ele é copiado.When the struct is assigned to a new variable, it is copied. A nova variável e a variável original, portanto, contêm duas cópias separadas dos mesmos dados.The new variable and the original variable therefore contain two separate copies of the same data. As alterações feitas em uma cópia não afetam a outra cópia.Changes made to one copy do not affect the other copy.

Em geral, as classes são usadas para modelar o comportamento mais complexo ou dados que serão modificados depois que um objeto de classe for criado.In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. Os structs são mais adequados para estruturas de dados pequenas que contêm principalmente dados que não serão modificados depois que o struct for criado.Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created.

Para obter mais informações, consulte Classes, Objetos e Structs.For more information, see Classes, Objects, and Structs.

ExemploExample

No exemplo a seguir, CustomClass no namespace ProgrammingGuide tem três membros: um construtor de instância, uma propriedade chamada Number e um método chamado Multiply.In the following example, CustomClass in the ProgrammingGuide namespace has three members: an instance constructor, a property named Number, and a method named Multiply. O método Main na classe Program cria uma instância (objeto) de CustomClass, e o método e a propriedade do objeto são acessados usando a notação de ponto.The 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. 

EncapsulamentoEncapsulation

Encapsulamento é chamado, ocasionalmente, de primeiro pilar ou princípio da programação orientada a objeto.Encapsulation is sometimes referred to as the first pillar or principle of object-oriented programming. De acordo com o princípio de encapsulamento, uma classe ou struct pode especificar qual membro será codificado fora da classe ou struct.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. Os métodos e as variáveis que não serão usados fora da classe ou assembly poderão ser ocultados para limitar erros de codificação potenciais ou explorações maliciosas.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.

Para obter mais informações sobre classes, consulte Classes e Objetos.For more information about classes, see Classes and Objects.

MembrosMembers

Todos os métodos, campos, constantes, propriedades e eventos devem ser declarados em um tipo. Eles são chamados de membros do tipo.All methods, fields, constants, properties, and events must be declared within a type; these are called the members of the type. No C#, não existem variáveis globais ou métodos como em algumas das outras linguagens.In C#, there are no global variables or methods as there are in some other languages. Até mesmo um ponto de entrada de um programa, o método Main, deve ser declarado em uma classe ou struct.Even a program's entry point, the Main method, must be declared within a class or struct. A lista a seguir inclui todos os vários tipos de membros que podem ser declarados em uma classe ou struct.The following list includes all the various kinds of members that may be declared in a class or struct.

AcessibilidadeAccessibility

Alguns métodos e propriedades devem ser chamados ou acessado pelo código fora de sua classe ou struct, também conhecido como código de cliente.Some methods and properties are meant to be called or accessed from code outside your class or struct, known as client code. Outros métodos e propriedades podem ser usados apenas na classe ou struct em si.Other methods and properties might be only for use in the class or struct itself. É importante limitar o acessibilidade do código para que somente o código do cliente desejado possa fazer contato.It is important to limit the accessibility of your code so that only the intended client code can reach it. É possível especificar quão acessível seus tipos e seus membros são para o código do cliente usando os modificadores de acesso público, protegido, interno, interno protegido, privado e privado protegido.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. A acessibilidade padrão é private.The default accessibility is private. Para obter mais informações, consulte Modificadores de acesso.For more information, see Access Modifiers.

HerançaInheritance

Classes (mas não structs) dão suporte ao conceito de herança.Classes (but not structs) support the concept of inheritance. Uma classe que deriva de outra classe (a classe base) contém automaticamente todos os membros públicos, protegidos e internos da classe base, exceto seus construtores e finalizadores.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. Para obter mais informações, consulte Herança e Polimorfismo.For more information, see Inheritance and Polymorphism.

As classes podem ser declaradas como abstratas, o que significa que um ou mais dos seus métodos não têm nenhuma implementação.Classes may be declared as abstract, which means that one or more of their methods have no implementation. Embora as classes abstratas não possam ser instanciadas diretamente, elas servem como classes base para outras classes que fornecem a implementação ausente.Although abstract classes cannot be instantiated directly, they can serve as base classes for other classes that provide the missing implementation. As classes também podem ser declaradas como lacradas para impedir que outras classes herdem delas.Classes can also be declared as sealed to prevent other classes from inheriting from them. Para obter mais informações, consulte Classes e membros de classes abstratos e lacrados.For more information, see Abstract and Sealed Classes and Class Members.

InterfacesInterfaces

Classes e estruturas podem herdar várias interfaces.Classes and structs can inherit multiple interfaces. Herdar de uma interface significa que o tipo implementa todos os métodos definidos na interface.To inherit from an interface means that the type implements all the methods defined in the interface. Para obter mais informações, consulte Interfaces.For more information, see Interfaces.

Tipos genéricosGeneric Types

Classes e estruturas podem ser definidas com um ou mais parâmetros de tipo.Classes and structs can be defined with one or more type parameters. O código do cliente fornece o tipo quando ele cria uma instância do tipo.Client code supplies the type when it creates an instance of the type. Por exemplo a classe List<T> no namespace System.Collections.Generic é definida com um parâmetro de tipo.For example The List<T> class in the System.Collections.Generic namespace is defined with one type parameter. O código do cliente cria uma instância de um List<string> ou List<int> para especificar o tipo que a lista conterá.Client code creates an instance of a List<string> or List<int> to specify the type that the list will hold. Para obter mais informações, consulte Genéricos.For more information, see Generics.

Tipos estáticosStatic Types

As classes (mas não structs) podem ser declaradas como estáticas.Classes (but not structs) can be declared as static. Uma classe estática pode conter apenas membros estáticos e não pode ser instanciada com a palavra-chave new.A static class can contain only static members and cannot be instantiated with the new keyword. Uma cópia da classe é carregada na memória quando o programa é carregado e seus membros são acessados pelo nome da classe.One copy of the class is loaded into memory when the program loads, and its members are accessed through the class name. Classes e structs podem conter membros estáticos.Both classes and structs can contain static members. Para obter mais informações, consulte Classes estáticas e membros de classes estáticas.For more information, see Static Classes and Static Class Members.

Tipos aninhadosNested Types

Uma classe ou struct pode ser aninhado em outra classe ou struct.A class or struct can be nested within another class or struct. Para obter mais informações, consulte Tipos aninhados.For more information, see Nested Types.

Tipos parciaisPartial Types

Você pode definir parte de uma classe, struct ou método em um arquivo de código e outra parte em um arquivo de código separado.You can define part of a class, struct or method in one code file and another part in a separate code file. Para obter mais informações, consulte Classes parciais e métodos.For more information, see Partial Classes and Methods.

Inicializadores de objetoObject Initializers

Você pode instanciar e inicializar objetos de classe ou struct e coleções de objetos sem chamar explicitamente seu construtor.You can instantiate and initialize class or struct objects, and collections of objects, without explicitly calling their constructor. Para obter mais informações, consulte Inicializadores de coleção e objeto.For more information, see Object and Collection Initializers.

Tipos anônimosAnonymous Types

Em situações nas quais não é conveniente ou necessário criar uma classe nomeada, por exemplo, quando você estiver preenchendo uma lista com estruturas de dados que você não precisa manter ou passar para outro método, use tipos anônimos.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. Para obter mais informações, consulte Tipos anônimos.For more information, see Anonymous Types.

Métodos de extensãoExtension Methods

Você pode "estender" uma classe sem criar uma classe derivada criando um tipo separado cujos métodos podem ser chamados como se pertencessem ao tipo original.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. Para obter mais informações, consulte Métodos de extensão.For more information, see Extension Methods.

Variáveis Locais Tipadas ImplicitamenteImplicitly Typed Local Variables

Dentro de um método de classe ou struct, você pode usar digitação implícita para instruir o compilador para determinar o tipo correto no tempo de compilação.Within a class or struct method, you can use implicit typing to instruct the compiler to determine the correct type at compile time. Para obter mais informações, consulte Variáveis locais de tipo implícito.For more information, see Implicitly Typed Local Variables.

Especificação da Linguagem C#C# Language Specification

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte tambémSee Also

Guia de Programação em C#C# Programming Guide