É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:
- Integrál numerikus típusok
- Lebegőpontos numerikus típusok
- logikai értéket képviselő bool
- Unicode UTF-16 karaktert képviselő karakter
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'
és2001
a típuschar
int
literá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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: