Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для aleksskay4
71 / 68 / 46
Регистрация: 02.12.2015
Сообщений: 891
Записей в блоге: 1

Когда использовать ссылочные типы, а когда использовать типы значений?

22.07.2018, 22:40. Показов 3065. Ответов 11

Студворк — интернет-сервис помощи студентам
Как это определить?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2018, 22:40
Ответы с готовыми решениями:

Когда нужно использовать структуры, когда классы, а когда словарь?
Хеллоу. Не могу понять, когда, что, нужно использовать. Допустим мне нужно получить объект, который имеет список объектов. И...

Когда следует использовать значимый тип, а когда ссылочный?
Почитал про значимые и ссылочные типы, ознакомился с отличиями между ними, как работают те и другие. Но хотел бы увидеть от...

Когда нужно использовать ссылку с out, а когда с ref
Не давно начал учить С# но не могу понять когда надо использовать оut или ref , я так понимаю что это ссылки как в С++. Единственно в чем...

11
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.07.2018, 22:53
Цитата Сообщение от aleksskay4 Посмотреть сообщение
Как это определить?
Если вам нужна семантика значения и копирования по значению, то используйте значимые типы.
Если нужна семантика копирования по ссылке, то ссылочные типы.

Если не знаете что вам нужно, то используйте классы.
0
 Аватар для aleksskay4
71 / 68 / 46
Регистрация: 02.12.2015
Сообщений: 891
Записей в блоге: 1
23.07.2018, 11:51  [ТС]
На просторах инета нашел:
В качестве примера мы рассмотрим простой тип Point2D, представляющий координаты точки в ограниченном двумерном пространстве. Каждая из двух координат может быть представлена значением типа short, а весь объект будет занимать четыре байта. Теперь допустим, что требуется сохранить в памяти массив с десятью миллионами точек. Какой объем памяти потребуется для этого?

Ответ на этот вопрос в значительной степени зависит от того, является ли тип Point2D ссылочным типом или типом значения. Если это ссылочный тип, массив с десятью миллионами точек будет хранить десять миллионов ссылок. В 32-разрядной системе для хранения десяти миллионов ссылок потребуется почти 40 Мбайт памяти. Сами объекты займут почти такой же объем. Фактически, как будет показано чуть ниже, каждый экземпляр Point2D занимает не менее 12 байт памяти, что в сумме для десяти миллионов точек дает 160 Мбайт памяти!

С другой стороны, если Point2D является типом значения, массив с десятью миллионами точек будет хранить десять миллионов точек и ни байтом больше, что в сумме составит 40 Мбайт, то есть в четыре раза меньше, чем для ссылочного типа

Добавлено через 33 секунды
Выходят когда много объектов лучше использовать структуры да?

Добавлено через 20 секунд
kolorotur,
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 12:08
Лучший ответ Сообщение было отмечено aleksskay4 как решение

Решение

Цитата Сообщение от aleksskay4 Посмотреть сообщение
Выходят когда много объектов лучше использовать структуры да?
Абсолютно нет.
К тому же объяснение, которое вы нашли, хоть и технически верно, на деле не может и не должно являться главной причиной выбора между значимыми и ссылочными типами. Если, конечно, нет конкретной проблемы, которая устраняется сменой класса на структуру.
Банально потому, что существует такая вещь как запаковка, при которой значимый тип превращается в ссылочный.

Используйте значимые типы если вам нужна семантика копирования по значению или имеется серьезная проблема с производительностью, которая измеряемо устраняется заменой ссылочного типа на значимый.
В остальных случаях используйте классы (ссылочные типы).
1
 Аватар для aleksskay4
71 / 68 / 46
Регистрация: 02.12.2015
Сообщений: 891
Записей в блоге: 1
23.07.2018, 12:15  [ТС]
используйте типы значений, если объекты достаточно малы и предполагается, что в программе будет создаваться большое их количество;

Добавлено через 26 секунд
тоже нашел
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
23.07.2018, 12:24
Цитата Сообщение от aleksskay4 Посмотреть сообщение
Выходят когда много объектов лучше использовать структуры да?
Дело не в количестве, а в том что это за объекты, что из себя представляют и как используются.
2
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 12:26
Цитата Сообщение от aleksskay4 Посмотреть сообщение
тоже нашел
Опять же, в зависимости от того, как эти объекты используются, весь выигрыш в производительности может полететь коту под хвост из-за запаковки или частого копирования.
Вопросы производительности — очень, очень специфичные и вссегда рассматриваются индивидуально.

Если вам нужно общее правило, то оно выше — семантика копирования.
1
 Аватар для aleksskay4
71 / 68 / 46
Регистрация: 02.12.2015
Сообщений: 891
Записей в блоге: 1
23.07.2018, 14:15  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
из-за запаковки
это что значит запаковка?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
23.07.2018, 14:17
Цитата Сообщение от aleksskay4 Посмотреть сообщение
это что значит запаковка?
C#
1
2
3
4
5
6
7
8
9
struct X
{
}
 
X x = new X();
 
object o = x; // запаковка (boxing)...
 
X xx = (X)o; // unboxing
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 14:17
Цитата Сообщение от aleksskay4 Посмотреть сообщение
что значит запаковка?
Превращение значимого типа в ссылочный.
0
 Аватар для aleksskay4
71 / 68 / 46
Регистрация: 02.12.2015
Сообщений: 891
Записей в блоге: 1
23.07.2018, 14:43  [ТС]
аа обычно слышал упаковка, понятно.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 15:03
Цитата Сообщение от aleksskay4 Посмотреть сообщение
обычно слышал упаковка
Возможно — я с русской терминологией не работаю, потому самодельные потуги переводить могут несколько отличаться от "официальных" источников.
По-басурмански — boxing/unboxing
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.07.2018, 15:03
Помогаю со студенческими работами здесь

Типы значения и ссылочные типы
Здравствуйте. Мог бы кто-нибудь простыми словами объяснить что такое типы значения и ссылочные типы применительно к структурам? ...

Когда использовать IEquatable<T>, а когда IStructuralEquatable?
Когда использовать IEquatable&lt;T&gt;, а когда IStructuralEquatable?

Для "c_auth.ClientRequest" не определены параметры-типы и поэтому нельзя использовать аргументы-типы
Прошу помощи. Делаю проект, но вылазит ошибка, а именно , а именно указывает вот сюда ClientRequest(Of L2Client)) Вот...

Когда стоит использовать класс, а когда лучше обойтись без них?
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

(MCS-51) Когда нужно использовать команду add а когда addc при суммировании?
когда нужно использовать команду add а когда addc при суммировании? ;(A)=C3H, (R6)=AAH ADD A,R6 ;(A)=6DH, (R6)=AAH ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru