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

Tipos de valor e tipos de referência são as duas principais categorias dos tipos C#.Value types and reference types are the two main categories of C# types. Uma variável de um tipo de valor contém uma instância do tipo.A variable of a value type contains an instance of the type. Isso difere 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 do método, os valores 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 o exemplo anterior mostra, as operações em uma variável de tipo de valor afetam apenas essa instância do tipo de valor, armazenada 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, apenas 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. Tanto a cópia quanto a instância original do tipo de valor têm acesso à mesma instância do 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áveis.To make your code less error-prone and more robust, define and use immutable value types. Este artigo usa tipos de valor mutáveis apenas para fins de demonstração.This article uses mutable value types only for demonstration purposes.

Tipos de tipos de valorKinds of value types

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 funcionalidades relacionadasa structure type, which encapsulates data and related functionality
  • um tipo de enumeração,que é definido por um conjunto de constantes nomeadas e representa uma escolha ou uma combinação de escolhasan enumeration type, which is defined by a set of named constants and represents a choice or a combination of choices

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

Tipos de valor incorporadoBuilt-in value types

C# fornece os seguintes tipos de valor embutidos, 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 certas 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 operands 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.

Começando com C# 7.0, C# suporta tuplas de valor.Beginning with C# 7.0, C# supports value tuples. Uma tuple 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