Обзор вопросов по языка програмиированию 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
string
class
object
interface
T[]
)Присваивание копирует ссылку, а не значение:
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✨