Typy wartości (odwołanie w C#)Value types (C# reference)

Typy wartości i typy referencyjne to dwie główne kategorie typów języka C#.Value types and reference types are the two main categories of C# types. Zmienna typu wartości zawiera wystąpienie typu.A variable of a value type contains an instance of the type. Różni się to od zmiennej typu referencyjnego, która zawiera odwołanie do wystąpienia typu.This differs from a variable of a reference type, which contains a reference to an instance of the type. Domyślnie przy przypisywaniuprzekazywanie argumentu do metody i zwracanie wyniku metody powoduje skopiowanie wartości zmiennych.By default, on assignment, passing an argument to a method, and returning a method result, variable values are copied. W przypadku zmiennych typu wartość są kopiowane odpowiednie wystąpienia typu.In the case of value-type variables, the corresponding type instances are copied. Poniższy przykład ilustruje takie zachowanie: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)

Jak pokazano w powyższym przykładzie, operacje na zmiennej typu wartości wpływają tylko na to wystąpienie typu wartości przechowywane w zmiennej.As the preceding example shows, operations on a value-type variable affect only that instance of the value type, stored in the variable.

Jeśli typ wartości zawiera element członkowski danych typu referencyjnego, podczas kopiowania wystąpienia typu wartości jest kopiowane tylko odwołanie do wystąpienia typu referencyjnego.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. Zarówno kopia, jak i oryginalne wystąpienie typu wartości mają dostęp do tego samego wystąpienia typu odwołania.Both the copy and original value-type instance have access to the same reference-type instance. Poniższy przykład ilustruje takie zachowanie: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]
    }
}

Uwaga

Aby kod był mniej podatny na błędy i bardziej niezawodny, definiować i korzystać z niezmiennego typu wartości.To make your code less error-prone and more robust, define and use immutable value types. W tym artykule są stosowane modyfikowalne typy wartości tylko w celach demonstracyjnych.This article uses mutable value types only for demonstration purposes.

Rodzaje typów wartościKinds of value types

Typ wartości może być jednym z dwóch następujących rodzajów:A value type can be one of the two following kinds:

  • Typ struktury, który hermetyzuje dane i powiązane funkcjea structure type, which encapsulates data and related functionality
  • Typ wyliczeniowy, który jest zdefiniowany przez zestaw nazwanych stałych i reprezentuje wybór lub kombinację opcjian enumeration type, which is defined by a set of named constants and represents a choice or a combination of choices

Typ wartości null T? reprezentuje wszystkie wartości jego bazowego typu wartości T oraz dodatkową wartość null .A nullable value type T? represents all values of its underlying value type T and an additional null value. Nie można przypisać null do zmiennej typu wartości, chyba że jest to typ wartości null.You cannot assign null to a variable of a value type, unless it's a nullable value type.

Wbudowane typy wartościBuilt-in value types

Język C# udostępnia następujące wbudowane typy wartości, znane także jako typy proste:C# provides the following built-in value types, also known as simple types:

Wszystkie typy proste są typami struktury i różnią się od innych typów struktury w tym, że dopuszczają pewne dodatkowe operacje:All simple types are structure types and differ from other structure types in that they permit certain additional operations:

  • Można użyć literałów, aby podać wartość typu prostego.You can use literals to provide a value of a simple type. Na przykład 'A' jest literałem typu char i 2001 jest literałem typu int .For example, 'A' is a literal of the type char and 2001 is a literal of the type int.

  • Stałe typów prostych można zadeklarować za pomocą słowa kluczowego const .You can declare constants of the simple types with the const keyword. Nie jest możliwe posiadanie stałych dla innych typów struktury.It's not possible to have constants of other structure types.

  • Wyrażenia stałe, których operandy to wszystkie stałe typów prostych, są oceniane w czasie kompilacji.Constant expressions, whose operands are all constants of the simple types, are evaluated at compile time.

Począwszy od języka C# 7,0, C# obsługuje krotki wartości.Beginning with C# 7.0, C# supports value tuples. Krotka wartości jest typem wartości, ale nie typem prostym.A value tuple is a value type, but not a simple type.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:For more information, see the following sections of the C# language specification:

Zobacz teżSee also