Обзор вопросов по языка програмиированию C# и технологии NET
В .NET все типы делятся на две большие категории:
| Категория | Примеры | Где хранятся | Особенности |
|---|---|---|---|
| Value types (значимые) | int, double, bool, struct, enum |
Stack / Inline в объекте | Хранят значение прямо, копируются при присваивании, не требуют GC для памяти самого значения |
| Reference types (ссылочные) | string, class, object, interface, массивы |
Heap | Хранят ссылку на объект, GC управляет памятью, присваивание копирует ссылку |
int (System.Int32) — 32-битное целое.long (System.Int64) — 64-битное целое.float (System.Single) — 32-битное с плавающей точкой.double (System.Double) — 64-битное с плавающей точкой.decimal (System.Decimal) — 128-битная точность, для финансов.bool — 1 байт, true / false.char — 16-битный символ Unicode.struct — пользовательские value type.enum — набор констант на основе целочисленного типа.Копируются при присваивании:
int a = 5;
int b = a; // создаётся копия
b = 10; // a остаётся 5
Nullable<T> (int?).Упаковка (Boxing) — преобразование value type в object:
int x = 42;
object obj = x; // boxing
int y = (int)obj; // unboxing
stringclassobjectinterfaceT[])Присваивание копирует ссылку, а не значение:
class Person { public string Name; }
Person p1 = new Person { Name = "Alice" };
Person p2 = p1;
p2.Name = "Bob";
Console.WriteLine(p1.Name); // "Bob"
null.string — особый reference typeReplace, Concat создают новые строки.T?)Для value type можно разрешить null через Nullable<T>:
int? x = null;
Внутри хранится value + flag (HasValue).
Stack:
Heap:
Boxing / Unboxing
| CLR тип | C# тип | Размер | Примечание |
|---|---|---|---|
System.Boolean |
bool |
1 байт | |
System.Byte |
byte |
1 байт | беззнаковый |
System.SByte |
sbyte |
1 байт | знаковый |
System.Int16 |
short |
2 байта | |
System.UInt16 |
ushort |
2 байта | беззнаковый |
System.Int32 |
int |
4 байта | |
System.UInt32 |
uint |
4 байта | беззнаковый |
System.Int64 |
long |
8 байт | |
System.UInt64 |
ulong |
8 байт | беззнаковый |
System.Single |
float |
4 байта | IEEE 754 |
System.Double |
double |
8 байт | IEEE 754 |
System.Decimal |
decimal |
16 байт | для финансов |
System.Char |
char |
2 байта | UTF-16 |
System.String |
string |
ссылочный | immutable |
System.Object |
object |
ссылочный | базовый тип |
Boxing / unboxing
Почему string reference, а int value?
Разница между struct и class
Nullable типы
Nullable<T> (HasValue + Value).Что происходит при присваивании
Размеры типов
int = 4 байта, long = 8 байт и т.д.Immutable vs mutable
int a = 10;
int b = a; // копия
b = 20;
Console.WriteLine(a); // 10
string s1 = "hello";
string s2 = s1; // ссылка на тот же объект
s2 = s2.Replace("h","H");
Console.WriteLine(s1); // "hello"
int? x = null;
if (x.HasValue)
Console.WriteLine(x.Value);
object obj = 42; // boxing
int y = (int)obj; // unboxing
✨Dvurechensky✨