С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
1

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

29.11.2017, 16:09. Показов 2540. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, сейчас интересуюсь теорией.
Хочу посмотреть на выражение string field = null; чуть по другому.

тип данных String - это оказывается КЛАСС который работает со строками.
А значить создается на куче екземпляр класса String (копия) , а слово field -
является ссылкой на адрес в ОЗУ и этой копии (екземпляру) и присваивается состоянии NULL

вроде и понимаю, но не до конца
Скажите я правильно это понял? может кто то по другому объяснит.

Добавлено через 10 минут
MyClass instance = new MyClass(); - создание экземпяр класса MyClass по сильной ссылке
new MyClass(); - создание экземпяр класса MyClass по слабой ссылке

В чем разница между сильной и слабой ссылками?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.11.2017, 16:09
Ответы с готовыми решениями:

Указатель на ссылочный тип
Доброго времени суток, не могу разобраться с маленькой проблемой: Имеется класс "Car" (его...

Тип string, ссылочный или примитивный?
Добрый день. До недавнего времени я считал тип "string" ссылочным. Сомнения в мой разум внесло...

Ссылочный тип string( использование ref)
Вопрос такой. При передаче методу параметром ссылочный тип( например массив) изменения видны в...

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

25
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
29.11.2017, 16:17 2
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
Скажите я правильно это понял?
Почти, малость усложнили тут:
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
слово field - является ссылкой на адрес в ОЗУ и этой копии
Замените фразу "на адрес ОЗУ и этой копии" на "на эту копию" и будет правильно.
Ссылка — это абстракция для получения доступа к объекту. Адрес это на участок в памяти или дескриптор — деталь реализации, о которой можете пока не задумываться.

Цитата Сообщение от Sayanchik777 Посмотреть сообщение
MyClass instance = new MyClass(); - создание экземпяр класса MyClass по сильной ссылке
new MyClass(); - создание экземпяр класса MyClass по слабой ссылке
В обоих случаях создается экземпляр класса, просто во втором случае ссылка на него выбрасывается.

Цитата Сообщение от Sayanchik777 Посмотреть сообщение
В чем разница между сильной и слабой ссылками?
Если под слабой ссылкой подразумевается WeakReference, то в отличие от "сильной" (обычной) ссылки ее наличие игнорируется сборщиком мусора.
Экземпляр, на который имеются только слабые ссылки, будет удален при следующей сборке.
Экземпляр, на который имеется хотя бы одна "сильная" ссылка, не будет удален.
2
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
29.11.2017, 16:55  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
WeakReference
а что это как понимать?

Добавлено через 28 минут
C#
1
2
3
4
5
6
Button a = new Button(); // создаем екземпляр класса Button по ссылке а. Копия
this.Controls.Add(a);  // Этомне понятно - полноценная кнопка находиться по адресу A -она розработана по чертижам Button 
 
 
 new Button();  /// а здесь ?вроде бы и можно задавать ей состояния а как ее вывети на форму?
                     // как с ней обрашаться? хочю понять оазницу в действии сильной и слабой ссылки
0
Эксперт .NET
12563 / 8732 / 1311
Регистрация: 21.01.2016
Сообщений: 32,761
29.11.2017, 17:15 4
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
// создаем екземпляр класса Button по ссылке а. Копия
Нет. Корретнее так: создаётся объект класса Button и ссылка на него помещается в a. Никаких копий.

Цитата Сообщение от Sayanchik777 Посмотреть сообщение
а здесь ?
А здесь почти так же как и выше: создаётся объект класса Button, но ссылка на него не сохраняется и при следующей сборке мусора ему придёт конец.
3
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
29.11.2017, 17:41  [ТС] 5
как можно отобразить кнопку по слабой ссылки - new Button() ?
0
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
29.11.2017, 18:09 6
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
new Button() ?
C#
1
2
3
//some code
(new SomeClass()).someMember
//some code
0
Эксперт .NET
12563 / 8732 / 1311
Регистрация: 21.01.2016
Сообщений: 32,761
29.11.2017, 19:25 7
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
как можно отобразить кнопку по слабой ссылки - new Button() ?
Что вы подразумеваете под "слабой ссылкой"? Отсутсвие у вас на руках именованной ссылки на объект не делает этот объект "слабоссылочным".
0
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
30.11.2017, 10:28  [ТС] 8
Ага, по слабой ссылке можно обратится к экземпляру только один раз. Правильно?
а по сильной ссылке..сколько душе угодно.
Правильно понял я?
0
Эксперт .NET
12563 / 8732 / 1311
Регистрация: 21.01.2016
Сообщений: 32,761
30.11.2017, 12:10 9
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
Ага, по слабой ссылке можно обратится к экземпляру только один раз. Правильно?
Нет. Это вообще нечто не из мира C#.

Выше уже объясняли: слабая ссылка не останавливает сборщик мусора, на чём её отличие от "сильной" и заканчивается.

Единственный способ организовать "слабую" ссылку в .NET - использоваться класс WeakReference. Всё остальное либо обычная ссылка, либо полное её отсутствие (например new SomeClass()).
0
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
30.11.2017, 13:45 10
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
Ага, по слабой ссылке можно обратится к экземпляру только один раз. Правильно?
а по сильной ссылке..сколько душе угодно.
Правильно понял я?
нет
Например это вообще не имеет ссылку:
C#
1
2
3
//some code
(new SomeClass()).someMember
//some code
Экземпляр исчез где то в памяти, и ждет GC...

Слабая ссылка (он же weak references) полезна как хороший способ кеширования. В отличии от обычной ссылки, слабую ссылку можно восстанавливать из памяти до тех пор пока ей не занялся GC (сборщик мусора).
Слабые ссылки актуальны для каких-то тяжелых экземпляров
Например вы имеете метод Func
C#
1
2
3
4
5
static void Func()
{
    MyHugeClass MyHugeObject =  new MyHugeClass()            
 //что то делается с   MyHugeObject            
}
который то и дело используется, например в цикле
C#
1
2
3
4
5
static void Main(string[] args){
  for(int i = 0; i < 10000; i++) {
    Func();
  }
}
Каждый раз когда функция выполняется ссылка на переменную MyHugeObject "удаляется", но экземпляр класса, он же экземпляр, он же объект класса MyHugeClass еще живет в не именованной области памяти, т.е память экземпляром еще занята и ждет своего звездного часа когда им займется GC (сборщик мусора), а если мы например вызываем эту функцию в цикле.. это может сильно раздуть память, т.к каждый раз создается новый экземпляр, тем самым понизив скорость работы, из-за промежуточных вызовов GС в случаях не хватки памяти.

Для решения этой проблемы есть слабая ссылка, которая ищет ранее удаленный объект, и если им не занялся GС то заново использует его...

C#
1
2
3
4
5
6
7
8
9
10
static void Func()
{
    MyHugeClass MyHugeObject;            
    if ( (w == null) || ( (MyHugeObject=w.Target as MyHugeClass) == null) )
    {
        MyHugeObject = new MyHugeClass();
        w = new WeakReference(MyHugeObject);
    }
    // work with MyHugeObject             
}

Зы. Не думаю что на первых парах стоит сильно углубляться в эти слабые ссылки..
3
Эксперт .NET
12563 / 8732 / 1311
Регистрация: 21.01.2016
Сообщений: 32,761
30.11.2017, 13:50 11
Цитата Сообщение от worldown Посмотреть сообщение
Для решения этой проблемы есть слабая ссылка, которая ищет ранее удаленный объект, и если им не занялся GС то заново использует его...
Что, простите?..
0
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
30.11.2017, 13:59 12
Цитата Сообщение от Usaga Посмотреть сообщение
Что, простите?..
я имел ввиду "ранее удаленную ссылку на объект"
0
Эксперт .NET
12563 / 8732 / 1311
Регистрация: 21.01.2016
Сообщений: 32,761
30.11.2017, 14:00 13
Цитата Сообщение от worldown Посмотреть сообщение
я имел ввиду "ранее удаленную ссылку на объект"
Что, простите?..
0
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
30.11.2017, 14:04 14
Цитата Сообщение от Usaga Посмотреть сообщение
Что, простите?..
Та это что теперь не так ? Не создает новый а использует ранее созданный..

Хорошо, хорошо.. ну ка объясните это своими словами тогда.. как это поняли Вы?
0
Эксперт .NET
12563 / 8732 / 1311
Регистрация: 21.01.2016
Сообщений: 32,761
30.11.2017, 14:11 15
worldown, вас я так понял: WeakReference куда лезет в поисках объекта. Это не так. WeakReference просто содержит ссылку на объект и всё.

Сборщик мусора знает этот класс "в лицо" и ссылки из этих классов не учитываются при определении актуальности объекта. Когда приходит время удалить объект, GC сбрасывает все "слабые" ссылки на него во всех WeakReference.

Вы можете сами увидеть, что класс WeakReference почти пустой и нигде ничего не ищет.
1
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
02.12.2017, 22:43  [ТС] 16
Цитата Сообщение от Usaga Посмотреть сообщение
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
// создаем екземпляр класса Button по ссылке а. Копия
Нет. Корретнее так: создаётся объект класса Button и ссылка на него помещается в a. Никаких копий.
C#
1
2
Button a = new Button();
a = new Button();
- создаётся объект класса Button и ссылка на него помещается в a
Button a - а это как понимать? ссылка типа Button, как это?
0
3564 / 2505 / 1174
Регистрация: 14.08.2016
Сообщений: 8,214
03.12.2017, 01:03 17
это ссылка на конкретный экземпляр класса Button
0
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
16.12.2017, 15:25  [ТС] 18
Цитата Сообщение от Diamante Посмотреть сообщение
это ссылка на конкретный экземпляр класса Button
а ссилка хранится стеке?
0
654 / 591 / 171
Регистрация: 17.07.2012
Сообщений: 1,678
Записей в блоге: 1
16.12.2017, 15:48 19
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
а ссилка хранится стеке?
Именно так.
0
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
16.12.2017, 16:17  [ТС] 20
Цитата Сообщение от Cupko Посмотреть сообщение
Именно так.
а если так Button a = Null; то кнопка удаляется на куче а в стеке что происходит? a - всеравно остается но пустой? ету часть памяти могут переопределить на другое что то?
0
16.12.2017, 16:17
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2017, 16:17
Помогаю со студенческими работами здесь

Как же всё-таки сделать копию Liss<T>, где Т - ссылочный тип (в моем случае -- класс)
class T { int d; DateTime f; public T(int d, DateTIme date = new DateTime()) { d = d; f =...

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

Получение значения массива через ссылочный индекс
Dictionary&lt;string, string&gt; sT = new Dictionary&lt;string, string&gt;() { {&quot;test&quot;,&quot;test&quot;}, ...

Привести один тип к другому. Тип универсальный, параметризируется другими типами
Доброго времени суток! Прошу помощи, что-то туплю. Под вечер или вообще :) Пытаюсь привести...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­­­­­­­­­­­­­х­р­о­н­­н­­­ы­­й счётчик с управляющим сигналом зад
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru