Добавить в корзинуПозвонить
Найти в Дзене
WEB MANIA

Сылочные и значимые типы в ОЗУ в C# это что?

C Sharp как и многие языки имеют свои особенности, если вы знаете какой-то язык программирования, то вы знаете что есть примитивные типы и сложные. Так вот в C Sharp своя структура типов, это связано с особенностями разделения оперативной памяти в платформе .NET. В С Sharp типы разделяются на два вида: Типы значений (значимые) целочисленные типы: byte, sbyte, shot, ushot, int, uint, long, ulong числа с плавающей точкой: float, double, decimal char(символ) , Enum (перечисления) ,Struct (структура) , object (общий тип) Ссылочные типы интерфейсы, коллекции, классы, делегаты, тип string. Разделение оперативной памяти в программе. Оперативная память при работе программы разделяется на два типа: Не важно какой объем ОЗУ будет, стек всё равно будет 1 либо 4 мегабайта, конечно это можно изменить, но это другая история. Так вот все типы значений или значимые типы располагаются в стеке, а ссылочные типы в куче. Что бы было понятней давайте на практике. Мы объявл
Оглавление

C Sharp как и многие языки имеют свои особенности, если вы знаете какой-то язык программирования, то вы знаете что есть примитивные типы и сложные.

Так вот в C Sharp своя структура типов, это связано с особенностями разделения оперативной памяти в платформе .NET. В С Sharp типы разделяются на два вида:

Типы значений (значимые)

целочисленные типы: byte, sbyte, shot, ushot, int, uint, long, ulong

числа с плавающей точкой: float, double, decimal

char(символ) , Enum (перечисления) ,Struct (структура) , object (общий тип)

Ссылочные типы

интерфейсы, коллекции, классы, делегаты, тип string.

Разделение оперативной памяти в программе.

Оперативная память при работе программы разделяется на два типа:

-2

Не важно какой объем ОЗУ будет, стек всё равно будет 1 либо 4 мегабайта, конечно это можно изменить, но это другая история.

Так вот все типы значений или значимые типы располагаются в стеке, а ссылочные типы в куче.

Что бы было понятней давайте на практике.

Мы объявляем переменную а и присваиваем значение 5 значит это переменная будет например типа int

int a= 5;

-3

Переменная-это именованная ячейка памяти и в данном случаи переменная а занимает 4 байта в стеке, в коде на языке C Sharp есть области видимости которые как правило задаются фигурными скобками,

давайте создадим условие и если оно правдивое создадим ещё пару переменных

int a= 5;

if(5>4) {

int b,c,d;

}

и так код начал выполнятся и выполнялось условие, переменные создаются и попадают в стек

-4

когда выполнение закончилось в этой области видимости эти созданные переменные удалятся из стека, это происходит очень быстро, ну и как вы поняли чем больше памяти стека тем больше одновременных операций можно выполнить. В значимих типах при копировании копируются сами данные, это надо запомнить то есть

int a=5;

int f=a;

-5

после копирования будет существовать переменная а со своими данными и переменная f со своими, соответственно если мы изменим данные в переменной f то данные в переменной a не изменятся.

Ссылочные типы ведут себя по другому, во первых они хранятся в куче до тех пор пока сборщик мусора не удалит их. Например мы создадим массив

int [] arr=new int[5];

Как видите с помощью слова new мы выделяем память в куче,

-6

в этом случаи переменная ведёт себя ни как именованная ячейка памяти, а как ссылка на адрес в памяти, где хранятся данные, соответственно если мы попробуем копировать данные, как скопировали значимые типы

int [] arr=new int[5];

int [] arr1=arr;

то в этом случаи скопируется только ссылка, а данные останутся неизменяемые.

-7

Теперь мы имеем переменные arr, arr1 которые указывают на одни и те же данные, получается если мы изменим массив в переменной arr1 то изменится массив и в переменной arr так как это один и тот же массив, поэтому копирование происходит с помощью специальных методов.

Также все ссылочные типы могут иметь значение null, что означает ссылка в никуда

arr=null;

-8

Теперь переменная arr пустая, но в arr1 массив всё ещё есть.

Вот собственно разница между ссылочными и значимыми типами, главное это надо помнить.

Тип string это исключение, это ссылочный тип но ведёт себя как значимый тип просто запомните.

Всем пока.😉