Tipos de valor (Referencia de C#)Value types (C# reference)

Los tipos de valor y los tipos de referencia son las dos categorías principales de tipos de C#.Value types and reference types are the two main categories of C# types. Una variable de un tipo de valor contiene una instancia del tipo.A variable of a value type contains an instance of the type. Esto difiere de una variable de un tipo de referencia, que contiene una referencia a una instancia del tipo.This differs from a variable of a reference type, which contains a reference to an instance of the type. De forma predeterminada, al asignar, pasar un argumento a un método o devolver el resultado de un método, se copian los valores de variable.By default, on assignment, passing an argument to a method, and returning a method result, variable values are copied. En el caso de las variables de tipo de valor, se copian las instancias de tipo correspondientes.In the case of value-type variables, the corresponding type instances are copied. En el ejemplo siguiente se muestra ese comportamiento: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 se muestra en el ejemplo anterior, las operaciones en una variable de tipo de valor solo afectan a esa instancia del tipo de valor, almacenado en la variable.As the preceding example shows, operations on a value-type variable affect only that instance of the value type, stored in the variable.

Si un tipo de valor contiene un miembro de datos de un tipo de referencia, solo se copia la referencia a la instancia del tipo de referencia al copiar una instancia de tipo de valor.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 la instancia de tipo de valor original como la copia tienen acceso a la misma instancia de tipo de referencia.Both the copy and original value-type instance have access to the same reference-type instance. En el ejemplo siguiente se muestra ese comportamiento: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]
    }
}

Nota

Para que el código sea menos propenso a errores y más sólido, defina y use tipos de valor inmutables.To make your code less error-prone and more robust, define and use immutable value types. En este artículo se usan tipos de valor mutables solo con fines de demostración.This article uses mutable value types only for demonstration purposes.

Clases de tipos de valorKinds of value types

Un tipo de valor puede ser de una de las dos clases siguientes:A value type can be one of the two following kinds:

  • un tipo de estructura, que encapsula los datos y la funcionalidad relacionada;a structure type, which encapsulates data and related functionality
  • un tipo de enumeración, que se define mediante un conjunto de constantes con nombre y representa una opción o una combinación de opciones.an enumeration type, which is defined by a set of named constants and represents a choice or a combination of choices

Un tipo de valor que admite valores NULL T? representa todos los valores de su tipo de valor subyacente T y un valor NULL adicional.A nullable value type T? represents all values of its underlying value type T and an additional null value. No se puede asignar null a una variable de un tipo de valor, a menos que sea un tipo de valor que acepte valores NULL.You cannot assign null to a variable of a value type, unless it's a nullable value type.

Tipos de valor integradosBuilt-in value types

C# proporciona los siguientes tipos de valor integrados, también conocidos como tipos simples:C# provides the following built-in value types, also known as simple types:

Todos los tipos simples son tipos de estructuras y se diferencian de otros tipos de estructuras en que permiten determinadas operaciones adicionales:All simple types are structure types and differ from other structure types in that they permit certain additional operations:

  • Se pueden usar literales para proporcionar un valor de un tipo simple.You can use literals to provide a value of a simple type. Por ejemplo, 'A' es un literal del tipo char y 2001 es un literal del tipo int.For example, 'A' is a literal of the type char and 2001 is a literal of the type int.

  • Puede declarar constantes de los tipos simples con la palabra clave const.You can declare constants of the simple types with the const keyword. No es posible tener constantes de otros tipos de estructuras.It's not possible to have constants of other structure types.

  • Las expresiones constantes, cuyos operandos son todas constantes de los tipos simples, se evalúan en tiempo de compilación.Constant expressions, whose operands are all constants of the simple types, are evaluated at compile time.

A partir de C# 7.0, C# admite tuplas de valor.Beginning with C# 7.0, C# supports value tuples. Una tupla de valor es un tipo de valor, pero no un tipo simple.A value tuple is a value type, but not a simple type.

Especificación del lenguaje C#C# language specification

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:For more information, see the following sections of the C# language specification:

Vea tambiénSee also