Tipi di valore (riferimenti per C#)Value types (C# reference)

I tipi di valore e i tipi di riferimento sono le due categorie principali di tipi C#.Value types and reference types are the two main categories of C# types. Una variabile di un tipo di valore contiene un'istanza del tipo.A variable of a value type contains an instance of the type. Questo comportamento è diverso da una variabile di un tipo riferimento, che contiene un riferimento a un'istanza del tipo.This differs from a variable of a reference type, which contains a reference to an instance of the type. Per impostazione predefinita, durante l' assegnazione, passando un argomento a un metodo e restituendo il risultato di un metodo, vengono copiati i valori delle variabili.By default, on assignment, passing an argument to a method, and returning a method result, variable values are copied. Nel caso di variabili di tipo valore, vengono copiate le istanze del tipo corrispondenti.In the case of value-type variables, the corresponding type instances are copied. L'esempio seguente illustra questo 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)

Come illustrato nell'esempio precedente, le operazioni su una variabile di tipo valore influiscono solo su tale istanza del tipo di valore, archiviata nella variabile.As the preceding example shows, operations on a value-type variable affect only that instance of the value type, stored in the variable.

Se un tipo di valore contiene un membro dati di un tipo di riferimento, quando viene copiata un'istanza del tipo di valore viene copiato solo il riferimento all'istanza del tipo di riferimento.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. Sia la copia che l'istanza del tipo di valore originale hanno accesso alla stessa istanza del tipo di riferimento.Both the copy and original value-type instance have access to the same reference-type instance. L'esempio seguente illustra questo 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]
    }
}

Nota

Per rendere il codice meno soggetto a errori e più affidabile, definire e utilizzare tipi di valore non modificabili.To make your code less error-prone and more robust, define and use immutable value types. Questo articolo usa tipi di valore modificabili solo a scopo dimostrativo.This article uses mutable value types only for demonstration purposes.

Tipi di tipi di valore e vincoli di tipoKinds of value types and type constraints

Un tipo di valore può essere uno dei due tipi seguenti:A value type can be one of the two following kinds:

  • tipo di strutturache incapsula i dati e la funzionalità correlataa structure type, which encapsulates data and related functionality
  • un tipo di enumerazione, definito da un set di costanti denominate e rappresenta una scelta o una combinazione di sceltean enumeration type, which is defined by a set of named constants and represents a choice or a combination of choices

Un tipo di valore Nullable T? rappresenta tutti i valori del tipo di valore sottostante T e un valore null aggiuntivo.A nullable value type T? represents all values of its underlying value type T and an additional null value. Non è possibile assegnare null a una variabile di un tipo di valore, a meno che non si tratti di un tipo di valore Nullable.You cannot assign null to a variable of a value type, unless it's a nullable value type.

È possibile utilizzare il struct vincolo per specificare che un parametro di tipo è un tipo di valore non nullable.You can use the struct constraint to specify that a type parameter is a non-nullable value type. I tipi di struttura e di enumerazione soddisfano il struct vincolo.Both structure and enumeration types satisfy the struct constraint. A partire da C# 7,3, è possibile usare System.Enum in un vincolo della classe di base (noto come vincolo enum) per specificare che un parametro di tipo è un tipo di enumerazione.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.

Tipi di valore predefinitiBuilt-in value types

In C# sono disponibili i seguenti tipi di valore predefiniti, noti anche come tipi semplici:C# provides the following built-in value types, also known as simple types:

Tutti i tipi semplici sono tipi di struttura e differiscono da quelli di altri tipi di struttura in quanto consentono determinate operazioni aggiuntive:All simple types are structure types and differ from other structure types in that they permit certain additional operations:

  • È possibile utilizzare valori letterali per fornire un valore di un tipo semplice.You can use literals to provide a value of a simple type. Ad esempio, 'A' è un valore letterale del tipo char e 2001 è un valore letterale del tipo int.For example, 'A' is a literal of the type char and 2001 is a literal of the type int.

  • È possibile dichiarare costanti dei tipi semplici con la parola chiave const.You can declare constants of the simple types with the const keyword. Non è possibile avere costanti di altri tipi di struttura.It's not possible to have constants of other structure types.

  • Le espressioni costanti, i cui operandi sono tutte costanti dei tipi semplici, vengono valutate in fase di compilazione.Constant expressions, whose operands are all constants of the simple types, are evaluated at compile time.

A partire da C# 7,0, C# supporta le Tuple di valori.Beginning with C# 7.0, C# supports value tuples. Una tupla di valori è un tipo di valore, ma non un tipo semplice.A value tuple is a value type, but not a simple type.

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:For more information, see the following sections of the C# language specification:

Vedi ancheSee also