Tipos de valor (referência C#)Value types (C# reference)

Tipos de valor e tipos de referência são as duas principais categorias de tipos C#.Value types and reference types are the two main categories of C# types. Uma variável de um tipo Value contém uma instância do tipo.A variable of a value type contains an instance of the type. Isso é diferente de uma variável de um tipo de referência, que contém uma referência a uma instância do tipo.This differs from a variable of a reference type, which contains a reference to an instance of the type. Por padrão, na atribuição, passando um argumento para um método e retornando um resultado de método, valores de variáveis são copiados.By default, on assignment, passing an argument to a method, and returning a method result, variable values are copied. No caso de variáveis de tipo de valor, as instâncias de tipo correspondentes são copiadas.In the case of value-type variables, the corresponding type instances are copied. O exemplo a seguir demonstra esse comportamento:The following example demonstrates that behavior:

using System;

public struct MutablePoint
{
    public int X;
    public int Y;

    public MutablePoint(int x, int y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

public class Program
{
    public static void Main()
    {
        var p1 = new MutablePoint(1, 2);
        var p2 = p1;
        p2.Y = 200;
        Console.WriteLine($"{nameof(p1)} after {nameof(p2)} is modified: {p1}");
        Console.WriteLine($"{nameof(p2)}: {p2}");

        MutateAndDisplay(p2);
        Console.WriteLine($"{nameof(p2)} after passing to a method: {p2}");
    }

    private static void MutateAndDisplay(MutablePoint p)
    {
        p.X = 100;
        Console.WriteLine($"Point mutated in a method: {p}");
    }
}
// Expected output:
// p1 after p2 is modified: (1, 2)
// p2: (1, 200)
// Point mutated in a method: (100, 200)
// p2 after passing to a method: (1, 200)

Como mostra o exemplo anterior, as operações em uma variável de tipo de valor afetam apenas essa instância do tipo de valor, armazenado na variável.As the preceding example shows, operations on a value-type variable affect only that instance of the value type, stored in the variable.

Se um tipo de valor contiver um membro de dados de um tipo de referência, somente a referência à instância do tipo de referência será copiada quando uma instância de tipo de valor for copiada.If a value type contains a data member of a reference type, only the reference to the instance of the reference type is copied when a value-type instance is copied. A instância de tipo de valor de cópia e original tem acesso à mesma instância de tipo de referência.Both the copy and original value-type instance have access to the same reference-type instance. O exemplo a seguir demonstra esse comportamento:The following example demonstrates that behavior:

using System;
using System.Collections.Generic;

public struct TaggedInteger
{
    public int Number;
    private List<string> tags;

    public TaggedInteger(int n)
    {
        Number = n;
        tags = new List<string>();
    }

    public void AddTag(string tag) => tags.Add(tag);

    public override string ToString() => $"{Number} [{string.Join(", ", tags)}]";
}

public class Program
{
    public static void Main()
    {
        var n1 = new TaggedInteger(0);
        n1.AddTag("A");
        Console.WriteLine(n1);  // output: 0 [A]

        var n2 = n1;
        n2.Number = 7;
        n2.AddTag("B");

        Console.WriteLine(n1);  // output: 0 [A, B]
        Console.WriteLine(n2);  // output: 7 [A, B]
    }
}

Observação

Para tornar seu código menos propenso a erros e mais robusto, defina e use tipos de valor imutável.To make your code less error-prone and more robust, define and use immutable value types. Este artigo usa tipos de valores mutáveis somente para fins de demonstração.This article uses mutable value types only for demonstration purposes.

Tipos de tipos de valor e restrições de tipoKinds of value types and type constraints

Um tipo de valor pode ser um dos dois tipos a seguir:A value type can be one of the two following kinds:

  • um tipo de estrutura, que encapsula dados e funcionalidade relacionadaa structure type, which encapsulates data and related functionality
  • um tipo de enumeração, que é definido por um conjunto de constantes nomeadas e representa uma opção ou uma combinação de opçõesan enumeration type, which is defined by a set of named constants and represents a choice or a combination of choices

Um tipo de valor anulável T? representa todos os valores de seu tipo de valor subjacente T e um valor nulo adicional.A nullable value type T? represents all values of its underlying value type T and an additional null value. Não é possível atribuir null a uma variável de um tipo de valor, a menos que seja um tipo de valor anulável.You cannot assign null to a variable of a value type, unless it's a nullable value type.

Você pode usar a struct restrição para especificar que um parâmetro de tipo é um tipo de valor não anulável.You can use the struct constraint to specify that a type parameter is a non-nullable value type. Os tipos de estrutura e enumeração atendem à struct restrição.Both structure and enumeration types satisfy the struct constraint. A partir do C# 7,3, você pode usar System.Enum em uma restrição de classe base (que é conhecida como restrição de enumeração) para especificar que um parâmetro de tipo é um tipo de enumeração.Beginning with C# 7.3, you can use System.Enum in a base class constraint (that is known as the enum constraint) to specify that a type parameter is an enumeration type.

Tipos de valores internosBuilt-in value types

O C# fornece os seguintes tipos de valor internos, também conhecidos como tipos simples:C# provides the following built-in value types, also known as simple types:

Todos os tipos simples são tipos de estrutura e diferem de outros tipos de estrutura, pois permitem determinadas operações adicionais:All simple types are structure types and differ from other structure types in that they permit certain additional operations:

  • Você pode usar literais para fornecer um valor de um tipo simples.You can use literals to provide a value of a simple type. Por exemplo, 'A' é um literal do tipo char e 2001 é um literal do tipo int.For example, 'A' is a literal of the type char and 2001 is a literal of the type int.

  • Você pode declarar constantes dos tipos simples com a palavra-chave const.You can declare constants of the simple types with the const keyword. Não é possível ter constantes de outros tipos de estrutura.It's not possible to have constants of other structure types.

  • Expressões constantes, cujos operandos são todas constantes dos tipos simples, são avaliadas no momento da compilação.Constant expressions, whose operands are all constants of the simple types, are evaluated at compile time.

A partir do C# 7,0, o C# dá suporte a tuplas de valor.Beginning with C# 7.0, C# supports value tuples. Uma tupla de valor é um tipo de valor, mas não um tipo simples.A value tuple is a value type, but not a simple type.

Especificação da linguagem C#C# language specification

Para obter mais informações, confira as seguintes seções da especificação da linguagem C#:For more information, see the following sections of the C# language specification:

Confira tambémSee also