Értéktípusok (C#-referencia)

Az értéktípusok és a referenciatípusok a C#-típusok két fő kategóriája. Egy érték típusú változó a típus egy példányát tartalmazza. Ez eltér egy referenciatípus változójától, amely a típus egy példányára mutató hivatkozást tartalmaz. Alapértelmezés szerint a hozzárendeléskor, az argumentum metódusnak való átadása és a metódus eredményének visszaadása esetén a változóértékek másolása történik. Érték típusú változók esetén a rendszer átmásolja a megfelelő típuspéldányokat. Az alábbi példa ezt a viselkedést mutatja be:

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)

Ahogy az előző példa is mutatja, az érték típusú változón végzett műveletek csak az értéktípus azon példányát érintik, amelyet a változó tárol.

Ha egy értéktípus egy referenciatípus adattagját tartalmazza, a rendszer csak a hivatkozástípus példányára mutató hivatkozást másolja át egy érték típusú példány másolásakor. A másolat és az eredeti érték típusú példány is rendelkezik hozzáféréssel ugyanahhoz a referenciatípus-példányhoz. Az alábbi példa ezt a viselkedést mutatja be:

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]
    }
}

Feljegyzés

Annak érdekében, hogy a kód kevésbé hibalehetőséget és robusztusabb legyen, definiáljon és használjon nem módosítható értéktípusokat. Ez a cikk csak bemutató célokra használ mutable értéktípusokat.

Értéktípusok és típuskorlátozások típusai

Az értéktípus a következő két típus egyike lehet:

  • egy struktúratípus, amely az adatokat és a kapcsolódó funkciókat foglalja magában
  • egy enumerálási típus, amelyet nevesített állandók halmaza határoz meg, és a választási lehetőségek választását vagy kombinációját jelöli

A null értékű értékekT? a mögöttes értéktípus T összes értékét és egy további null értéket jelölnek. Értéktípusú változóhoz csak akkor rendelhet hozzá null , ha null értékű.

A kényszer használatával struct megadhatja, hogy egy típusparaméter nem null értékű típus-e. A struktúra és az enumerálási típusok egyaránt megfelelnek a kényszernek struct . Az alaposztály-kényszerben (más néven enumerálási kényszerben) megadhatjaSystem.Enum, hogy a típusparaméter enumerálási típus-e.

Beépített értéktípusok

A C# a következő beépített értéktípusokat, más néven egyszerű típusokat biztosítja:

Minden egyszerű típus struktúratípus, és különbözik a többi struktúratípustól, mivel lehetővé teszik bizonyos további műveletek elvégzését:

  • A literálok használatával egyszerű típusú értéket adhat meg. Például a típus literálja, 'A' és 2001 a típus charintliterálja.

  • Az egyszerű típusok állandóit a const kulcsszóval deklarálhatja. Más típusú szerkezetek állandói nem lehetnek.

  • Az állandó kifejezéseket, amelyek operandusai az egyszerű típusok állandói, fordításkor értékelik ki.

Az értékrekord egy értéktípus, de nem egyszerű típus.

C# nyelvspecifikáció

További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:

Lásd még