Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Типы значений и ссылочные типы — это две основные категории типов C#. Переменная типа значения содержит экземпляр типа. Это поведение отличается от переменной ссылочного типа, содержащей ссылку на экземпляр типа. По умолчанию при назначении передается аргумент в метод и возвращается результат метода, вы копируете значения переменных. В случае переменных типа значений копируются соответствующие экземпляры типов. В следующем примере продемонстрировано такое поведение.
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)
Как показано в предыдущем примере, операции с переменной типа значения влияют только на этот экземпляр типа значения, хранящийся в переменной.
Если тип значения содержит элемент данных ссылочного типа, скопируйте только ссылку на экземпляр ссылочного типа при копировании экземпляра типа значения. Как скопированный, так и исходный экземпляр типа значения имеют доступ к одному и тому же экземпляру ссылочного типа. В следующем примере продемонстрировано такое поведение.
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]
}
}
Примечание.
Чтобы сделать код менее подверженным ошибкам и более надежным, определите и используйте неизменяемые типы значений. В этой статье изменяемые типы значений используются только в демонстрационных целях.
Виды типов значений и ограничения типов
Тип значения может быть одним из следующих типов:
- Тип структуры, который инкапсулирует данные и связанные функции.
- Тип перечисления, который определяется набором именованных констант и представляет выбор или сочетание вариантов.
- Объявление объединения, определяющее закрытый набор типов вариантов, которые могут представлять значение.
, представляет все значения своего базового типа значения T?, а также дополнительное значение T. Невозможно назначить null переменной типа значения, если только это не тип значения, допускающий значение NULL.
struct
Используйте ограничение, чтобы указать, что параметр типа является типом ненулевого значения. Типы структуры и перечисления удовлетворяют ограничению struct. Используйте System.Enum в ограничении базового класса (которое называется ограничением перечисления), чтобы указать, что параметр типа является типом перечисления.
Встроенные типы значений
C# предоставляет следующие встроенные типы значений, которые также называются простыми типами.
- Целочисленные типы
- Числовые типы с плавающей запятой
- bool, представляющий логическое значение
- char, представляющий символ Юникода UTF-16
Все простые типы — это типы структур. Они отличаются от других типов структур в том, что они разрешают определенные дополнительные операции:
Литералы можно использовать для предоставления значения простого типа.
Например,'A'это литерал типа,charэто литерал типа2001int, и12.34mэто литерал типаdecimal.Константы простых типов можно объявить с помощью ключевого слова const .
Например, можно определитьconst decimal = 12.34m.
Нельзя объявлять константы других типов структур.Константные выражения, операнды которых являются константами простых типов, вычисляются во время компиляции.
Кортеж значений — это тип значения, но не простой тип.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#: