Tipos e variáveisTypes and variables

Há dois tipos em C#: tipos de referência e tipos de valor.There are two kinds of types in C#: value types and reference types. As variáveis de tipos de valor contêm diretamente seus dados enquanto variáveis de tipos de referência armazenam referências a seus dados, o último sendo conhecido como objetos.Variables of value types directly contain their data whereas variables of reference types store references to their data, the latter being known as objects. Com os tipos de referência, é possível que duas variáveis referenciem o mesmo objeto e, assim, possíveis para operações em uma variável afetem o objeto referenciado pela outra variável.With reference types, it's possible for two variables to reference the same object and thus possible for operations on one variable to affect the object referenced by the other variable. Com os tipos de valor, as variáveis têm sua própria cópia dos dados, e não é possível que as operações em um afetem a outra (exceto ref para out variáveis de parâmetro e).With value types, the variables each have their own copy of the data, and it isn't possible for operations on one to affect the other (except for ref and out parameter variables).

Os tipos de valor do C# são divididos em tipos simples, tipos de enumeração, tipos de structe tipos de valor anulável.C#'s value types are further divided into simple types, enum types, struct types, and nullable value types. Os tipos de referência do C# são divididos em tipos de classe, tipos de interface, tipos de matrize tipos delegados.C#'s reference types are further divided into class types, interface types, array types, and delegate types.

A seguinte estrutura de tópicos fornece uma visão geral do sistema de tipos do C#.The following outline provides an overview of C#'s type system.

  • Tipos de valorValue types
    • Tipos simplesSimple types
      • Integral com sinal: sbyte, short, int,longSigned integral: sbyte, short, int, long
      • Integral sem sinal: byte, ushort, uint,ulongUnsigned integral: byte, ushort, uint, ulong
      • Caracteres Unicode: charUnicode characters: char
      • Ponto flutuante binário de IEEE: float, doubleIEEE binary floating-point: float, double
      • Ponto flutuante decimal de alta precisão: decimalHigh-precision decimal floating-point: decimal
      • Booliano: boolBoolean: bool
    • Tipos de enumeraçãoEnum types
      • Tipos definidos pelo usuário do formulário enum E {...}User-defined types of the form enum E {...}
    • Tipos structStruct types
      • Tipos definidos pelo usuário do formulário struct S {...}User-defined types of the form struct S {...}
    • Tipos de valor anulávelNullable value types
      • Extensões de todos os outros tipos de valor com um valor nullExtensions of all other value types with a null value
    • Tipos de valor de tuplaTuple value types
      • Tipos definidos pelo usuário do formulário (T1, T2, ...)User-defined types of the form (T1, T2, ...)
  • Tipos de referênciaReference types
    • Tipos de aulaClass types
      • Classe base definitiva de todos os outros tipos: objectUltimate base class of all other types: object
      • Cadeia de caracteres Unicode: stringUnicode strings: string
      • Tipos definidos pelo usuário do formulário class C {...}User-defined types of the form class C {...}
    • Tipos de interfaceInterface types
      • Tipos definidos pelo usuário do formulário interface I {...}User-defined types of the form interface I {...}
    • Tipos de matrizArray types
      • Unidimensional e multidimensional, por exemplo, int[] e int[,]Single- and multi-dimensional, for example, int[] and int[,]
    • Tipos delegadosDelegate types
      • Tipos definidos pelo usuário do formulário delegate int D(...)User-defined types of the form delegate int D(...)

Para obter mais informações sobre tipos numéricos, veja a tabela Tipos integrais e Tipos de ponto flutuante.For more information about numeric types, see Integral types and Floating-point types table.

O bool true tipo do C# é usado para representar valores Boolianos — valores que são falseou.C#'s bool type is used to represent Boolean values—values that are either true or false.

O processamento de cadeia de caracteres e caracteres em C# usa codificação Unicode.Character and string processing in C# uses Unicode encoding. O tipo char representa uma unidade de código UTF-16 e o tipo string representa uma sequência de unidades de código UTF-16.The char type represents a UTF-16 code unit, and the string type represents a sequence of UTF-16 code units.

Os programas em C# usam declarações de tipos para criar novos tipos.C# programs use type declarations to create new types. Uma declaração de tipo especifica o nome e os membros do novo tipo.A type declaration specifies the name and the members of the new type. Cinco das categorias de tipos do C# são definíveis pelo usuário: tipos de classe, tipos de struct, tipos de interface, tipos de enumeração e tipos delegados.Five of C#'s categories of types are user-definable: class types, struct types, interface types, enum types, and delegate types.

Um tipo class define uma estrutura de dados que contém membros de dados (campos) e membros de função (métodos, propriedades e outros).A class type defines a data structure that contains data members (fields) and function members (methods, properties, and others). Os tipos de classe dão suporte à herança única e ao polimorfismo, mecanismos nos quais as classes derivadas podem estender e especializar as classes base.Class types support single inheritance and polymorphism, mechanisms whereby derived classes can extend and specialize base classes.

Um tipo struct é semelhante a um tipo de classe que representa uma estrutura com membros de dados e membros da função.A struct type is similar to a class type in that it represents a structure with data members and function members. No entanto, ao contrário das classes, as structs são tipos de valor e normalmente não exigem alocação de heap.However, unlike classes, structs are value types and don't typically require heap allocation. Tipos de struct não dão suporte à herança especificada pelo usuário e todos os tipos de struct herdam implicitamente do tipo object.Struct types don't support user-specified inheritance, and all struct types implicitly inherit from type object.

Um tipo interface define um contrato como um conjunto nomeado de membros da função pública.An interface type defines a contract as a named set of public function members. Um class ou struct que implementa um interface deve fornecer implementações dos membros da função da interface.A class or struct that implements an interface must provide implementations of the interface's function members. Um interface pode herdar de várias interfaces base e um class ou struct pode implementar várias interfaces.An interface may inherit from multiple base interfaces, and a class or struct may implement multiple interfaces.

Um tipo delegate representa referências aos métodos com uma lista de parâmetros e tipo de retorno específicos.A delegate type represents references to methods with a particular parameter list and return type. Delegados possibilitam o tratamento de métodos como entidades que podem ser atribuídos a variáveis e passadas como parâmetros.Delegates make it possible to treat methods as entities that can be assigned to variables and passed as parameters. Os delegados são análogos aos tipos de função fornecidos pelas linguagens funcionais.Delegates are analogous to function types provided by functional languages. Eles também são semelhantes ao conceito de ponteiros de função encontrados em algumas outras linguagens.They're also similar to the concept of function pointers found in some other languages. Diferentemente de ponteiros de função, os delegados são orientados a objeto e são de tipo seguro.Unlike function pointers, delegates are object-oriented and type-safe.

Os class delegate tipos struct, interface, e oferecem suporte a genéricos, no qual eles podem ser parametrizados com outros tipos.The class, struct, interface, and delegate types all support generics, whereby they can be parameterized with other types.

Um tipo enum é um tipo distinto com constantes nomeadas.An enum type is a distinct type with named constants. Cada tipo enum tem um tipo subjacente, que deve ser um dos oito tipos integrais.Every enum type has an underlying type, which must be one of the eight integral types. O conjunto de valores de um tipo enum é o mesmo que o conjunto de valores do tipo subjacente.The set of values of an enum type is the same as the set of values of the underlying type.

O C# dá suporte a matrizes uni e multidimensionais de qualquer tipo.C# supports single- and multi-dimensional arrays of any type. Ao contrário dos tipos listados acima, os tipos de matriz não precisam ser declarados antes que possam ser usados.Unlike the types listed above, array types don't have to be declared before they can be used. Em vez disso, os tipos de matriz são construídos seguindo um nome de tipo entre colchetes.Instead, array types are constructed by following a type name with square brackets. Por exemplo, int[] é uma matriz unidimensional de int, int[,] é uma matriz bidimensional de int, e int[][] é uma matriz unidimensional da matriz unidimensional de int.For example, int[] is a single-dimensional array of int, int[,] is a two-dimensional array of int, and int[][] is a single-dimensional array of single-dimensional array of int.

Os tipos de valor anulável também não precisam ser declarados antes que possam ser usados.Nullable value types also don't have to be declared before they can be used. Para cada tipo Tde valor não anulável, há um tipo T?de valor anulável correspondente, que pode conter um valor adicional, null.For each non-nullable value type T, there is a corresponding nullable value type T?, which can hold an additional value, null. Por exemplo, int? é um tipo que pode conter qualquer número inteiro de 32 bits ou o valor null.For instance, int? is a type that can hold any 32-bit integer or the value null.

O sistema de tipos do C# é unificado, de modo que um valor de qualquer objecttipo pode ser tratado como um.C#'s type system is unified such that a value of any type can be treated as an object. Cada tipo no C#, direta ou indiretamente, deriva do tipo de classe object, e object é a classe base definitiva de todos os tipos.Every type in C# directly or indirectly derives from the object class type, and object is the ultimate base class of all types. Os valores de tipos de referência são tratados como objetos simplesmente exibindo os valores como tipo object.Values of reference types are treated as objects simply by viewing the values as type object. Os valores de tipos de valor são tratados como objetos, executando conversão boxing e operações de conversão unboxing.Values of value types are treated as objects by performing boxing and unboxing operations. No exemplo a seguir, um valor int é convertido em object e volta novamente ao int.In the following example, an int value is converted to object and back again to int.

using System;
class BoxingExample
{
    static void Main()
    {
        int i = 123;
        object o = i;    // Boxing
        int j = (int)o;  // Unboxing
    }
}

Quando um valor de um tipo de valor é atribuído a object uma referência, uma "caixa" é alocada para conter o valor.When a value of a value type is assigned to an object reference, a "box" is allocated to hold the value. Essa caixa é uma instância de um tipo de referência, e o valor é copiado para essa caixa.That box is an instance of a reference type, and the value is copied into that box. Por outro lado, quando uma object referência é convertida em um tipo de valor, é feita uma verificação de object que a referência é uma caixa do tipo de valor correto.Conversely, when an object reference is cast to a value type, a check is made that the referenced object is a box of the correct value type. Se a verificação for realizada com sucesso, o valor na caixa será copiado para o tipo de valor.If the check succeeds, the value in the box is copied to the value type.

O sistema de tipos unificados do C# significa efetivamente que os object tipos de valor são tratados como referências "sob demanda".C#'s unified type system effectively means that value types are treated as object references "on demand." Devido à unificação, as bibliotecas de uso geral que usam object o tipo podem ser usadas com todos os tipos objectque derivam de, incluindo tipos de referência e tipos de valor.Because of the unification, general-purpose libraries that use type object can be used with all types that derive from object, including both reference types and value types.

Existem vários tipos de variáveis no C#, incluindo campos, elementos de matriz, variáveis locais e parâmetros.There are several kinds of variables in C#, including fields, array elements, local variables, and parameters. As variáveis representam os locais de armazenamento e cada variável tem um tipo que determina quais valores podem ser armazenados na variável, conforme mostrado abaixo.Variables represent storage locations, and every variable has a type that determines what values can be stored in the variable, as shown below.

  • Tipo de valor não nuloNon-nullable value type
    • Um valor de tipo exatoA value of that exact type
  • Tipos de valor anulávelNullable value type
    • Um valor null ou um valor do tipo exatoA null value or a value of that exact type
  • objetoobject
    • Uma referência null, uma referência a um objeto de qualquer tipo de referência ou uma referência a um valor de qualquer tipo de valor demarcadoA null reference, a reference to an object of any reference type, or a reference to a boxed value of any value type
  • Tipo de classeClass type
    • Uma referência null, uma referência a uma instância desse tipo de classe ou uma referência a uma instância de uma classe derivada desse tipo de classeA null reference, a reference to an instance of that class type, or a reference to an instance of a class derived from that class type
  • Tipo de interfaceInterface type
    • Uma referência null, uma referência a uma instância de um tipo de classe que implementa esse tipo de interface ou uma referência a um valor demarcado de um tipo de valor que implementa esse tipo de interfaceA null reference, a reference to an instance of a class type that implements that interface type, or a reference to a boxed value of a value type that implements that interface type
  • Tipo de matrizArray type
    • Uma referência null, uma referência a uma instância desse tipo de matriz ou uma referência a uma instância de um tipo de matriz compatívelA null reference, a reference to an instance of that array type, or a reference to an instance of a compatible array type
  • Tipo delegadoDelegate type
    • Uma referência null ou uma referência a uma instância de um tipo de delegado compatívelA null reference or a reference to an instance of a compatible delegate type