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 tipos de referência, é possível que duas variáveis referenciem o mesmo objeto e, portanto, é possível que operações em uma variável afetem o objeto referenciado por outra variável.With reference types, it is 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 tipos de valor, cada variável tem sua própria cópia dos dados e não é possível que operações em uma variável afetem a outra (exceto no caso de variáveis de parâmetros ref e out).With value types, the variables each have their own copy of the data, and it is not possible for operations on one to affect the other (except in the case of ref and out parameter variables).

Os tipos de valor do C# são divididos em tipos simples, tipos de enum, tipos struct e 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 matriz e tipos delegados.C#’s reference types are further divided into class types, interface types, array types, and delegate types.

O exemplo a seguir fornece uma visão geral do sistema de tipos do C#.The following 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 enumeradosEnum 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áveisNullable 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 referênciaReference types
    • Tipos de classeClass 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 tipo bool do C# é usado para representar valores boolianos — valores que são true ou false.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 do C# de tipos são tipos definidos pelo usuário: tipos de classe, tipos struct, tipos de interface, tipos enum 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, diferentemente das classes, structs são tipos de valor e, normalmente, não precisam de alocação de heap.However, unlike classes, structs are value types and do not typically require heap allocation. Os tipos de estrutura não dão suporte à herança especificada pelo usuário, e todos os tipos de structs são herdados implicitamente do tipo object.Struct types do not 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 de 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 parecidos com o conceito de ponteiros de função em outras linguagens, mas, ao contrário dos ponteiros de função, os delegados são orientados a objetos e fortemente tipados.They are also similar to the concept of function pointers found in some other languages, but unlike function pointers, delegates are object-oriented and type-safe.

Os tipos class, struct, interface e delegate dão suporte a genéricos e 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 de serem usados.Unlike the types listed above, array types do not 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 de serem usados.Nullable value types also do not have to be declared before they can be used. Para cada tipo de valor não nulo T há um tipo de valor anulável correspondente T?, 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 tipo pode ser tratado como um object.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 é convertido para o tipo object, uma instância object, também chamada de "caixa", é alocada para armazenar o valor e o valor é copiado na caixa.When a value of a value type is converted to type object, an object instance, also called a "box", is allocated to hold the value, and the value is copied into that box. Por outro lado, quando uma referência object é convertida em um tipo de valor, é verificado se o object referenciado é uma caixa do tipo de valor correto e, se a verificação for bem-sucedida, o valor na caixa será copiado.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, and, if the check succeeds, the value in the box is copied out.

O sistema de tipo unificado do C# significa que os tipos de valor podem se tornar objetos “sob demanda”.C#’s unified type system effectively means that value types can become objects "on demand." Devido à unificação, as bibliotecas de finalidade geral que usam o tipo object podem ser usadas com os tipos de referência e os tipos de valor.Because of the unification, general-purpose libraries that use type object can be used with 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