КЛЮЧЕВОЕ СЛОВО REF C# | C# ref что это и для чего нужно | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | # 43
ฝัง
- เผยแพร่เมื่อ 13 ต.ค. 2024
- В этом уроке мы изучим ключевое слово ref в языке программирования C#, выясним для чего оно нужно, как используется, как ref работает для ссылочных типов и для значимых типов, а так же последние нововведения относительно модификатора ref в последних версиях языка программирования C#.
➡️ Мой курс C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ на Udemy
👉 www.udemy.com/...
✅Домашнее задание к уроку bit.ly/3eEPwAZ
✅ССЫЛОЧНЫЕ И ЗНАЧИМЫЕ ТИПЫ C# | СТЕК И КУЧА C# | REFERENCE AND VALUE TYPES C# | C# Уроки | # 38 bit.ly/3ckSKI4
✅ЧТО ТАКОЕ NULL | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | # 39 bit.ly/3dmDFXO
✅Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут!=)
✅Доступ к исходному коду и спонсорство / simplecode
✅ donatepay.ru/d...
✅BTC кошелек: 12oYfJnvt76wjJbpvfhM41m6KPz6uz4LD4
✅ Telegram канал t.me/SergeySim...
✅Наша группа ВК smplcode
✅Подписывайтесь на канал / @simplecodeit
#сишарп #simplecode #урокипрограммирования #ref
Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)
✅Доступ к исходному коду и спонсорство www.patreon.com/SimpleCode
✅ donatepay.ru/don/SimpleCode
✅BTC кошелек: 12oYfJnvt76wjJbpvfhM41m6KPz6uz4LD4
что-что, а объяснять сложное простым языком у вас получается. таких бы людей везде: и в школах, и в универах, и на ютубе)
Тут
Тут
Ураа! Новый урок! Спс от души просто!!! Боялся что ты забросишь уроки.
Благодарность огромная,учусь по твоим урокам,и другим советую твой канал, который лучший на ютубе по языку с#👍
Кхм-кхм...CodeBlog 🔝
Но,здесь есть плюсы,Сергей раскрывает все детали каждой темы просто и понятно.Но очень долго ждать новых видео-уроков,пока до тех же делегатов дойдем...эх...Ну и практических заданий бы.
@@minoddein7205 у codebloge тоже все понятно но code blog мастер обьяснять простве вещи на протяжение часа
Спасибо за урок!) Ждем List)
Три раза(от начала до конца) пересмотрел этот урок, только потом начал понемногу понимать.
Аналогично
буквально также посмотрел 3 раза:D
Хз я сразу понял
Большое спасибо за урок! Жду новых!
Ты не представляешь, как ты мне помог разобраться во многих темах, большое тебе человеческое спасибо!
Огромнейшее спасибо! Такую сложную тему так легко раскидать!
Это талант! Огромное спасибо! Мира вашему дому.
Отличные уроки, спасибо! Я в C# хоть и не новичок, но тоже очень полезно пересмотреть. Очень часто наталкиваюсь на что-то новое о существовании которого и не догадывался, а делал раньше по старинке.
Если бы можно было ставить лайк не видео отдельно а всему каналу сразу, я бы автору его поставил... перечитал кучу книг и перепробовал кучу софта с самообучением программированию, но здесь подача просто божественная
Сергей, спасибо вам за урок! Сделайте пожалуйста следующий выпуск про использование выходного параметра out.
Спппасибо дяде Сереже за достойный контент
Один из лучших курсов! Спасибо, что делитесь знаниями!
смотрел этот урок 3 года назад и все было понятно, когда сам столкнулся с этой проблемой пересмотрел и понял все, на все 100%
На каждое видео по csharp ставлю лайк. Спасибо большое за такие понятные уроки, читаю параллельно книгу по unity и еще одну книгу просто про csharp, если бы не ваши уроки, то врятли что-то поняла еще на стадии переменных! Там хоть и стараются авторы писать очень простым языком, но все равно у вас нагляднее и понятнее, возможно еще и потому что вы подаете материал дозированно.
подскажи по юнити книгу
Я только начал своё изучение С#
Спасибо за понятные и чёткие уроки. Надеюсь ты не забросиш это дело и доведёш всё до конца👍💪💪
как результат за 2 года?
@@ptichkasinichkamia зарабатывает 300к в наносекунду
Спасибо за урок!
Спасибо большое за уроки
Раньше смотрел в основном англоязычный ютуб, но тут попались вы Сергей и очень понравилось, как вы объясняете. Теперь буду смотреть и вас после этого урока)
Спасибо тебе за эти уроки! Очень внятно и доступно
спасибо! все уроки - очень понятным языком
Как много слов , как много информации . Но под конец урока всё таки смог осознать принцип работы этого ref.Спасибо за урок !)
Сергей, спасибо за урок! Как всегда всё понятно и вообще супер!)
Спасибо, Сергей!
Уф....Ну что могу сказать... Два дня с перерывами ломал голову. После завершения, понял что хоть я и указываю слово fer, но абсолютно его не использую. А так все работает. Понимаю, что не плохо было бы предусмотреть некоторые особенности (например при получении массива с 0 элементов, программа выдаст ошибку, тк попытается убрать еще один элемент в массиве без элементов), но в контексте моей программы, это невозможно.
static int[] Resize (ref int[] FirstArr)
{
Console.WriteLine(" Массив какого размера вам нужен? Введите число элементов :");
int YourElements = int.Parse(Console.ReadLine());
int[] FinalArr = new int[YourElements];
for (int i = 0; i < FinalArr.Length; i++)
{
if (i < FirstArr.Length)
FinalArr[i] = FirstArr[i];
else
FinalArr[i] = 0;
}
return FinalArr;
}
static int[] Add (ref int[] FirstArr)
{
Console.WriteLine(" 1 - добавить первый элемент
2 - добавить элемент по индексу
3 - добавить последний элемент");
int[] FinalArr = new int[FirstArr.Length+1];
int YourChoiсe2 = int.Parse(Console.ReadLine());
if (YourChoiсe2==1)
{
Console.WriteLine(" Новый элемент добавлен в начало массива, какое значение ему присвоить?");
int AddElem = int.Parse(Console.ReadLine());
for (int i = 0; i < FinalArr.Length; i++)
if (i < FirstArr.Length)
FinalArr[i+1] = FirstArr[i];
FinalArr[0] = AddElem;
}
if (YourChoiсe2==2)
{
Console.WriteLine(" Элемент с каим индексом требуется добавить?");
int IndexOf = int.Parse(Console.ReadLine());
Console.WriteLine(" Какое значение требуется присвоить этоиу элементу?");
int AddElem = int.Parse(Console.ReadLine());
for (int i = 0; i < FinalArr.Length; i++)
{
if (i < FirstArr.Length)
FinalArr[i] = FirstArr[i];
}
FinalArr[IndexOf] = AddElem;
}
if (YourChoiсe2==3)
{
Console.WriteLine(" Новый элемент добавлен в конец массива, какое значение ему присвоить?");
int AddElem = int.Parse(Console.ReadLine());
for (int i = 0; i < FinalArr.Length; i++)
{
if (i < FirstArr.Length)
FinalArr[i] = FirstArr[i];
}
FinalArr[^1] = AddElem;
}
return FinalArr;
}
static int[] Delete(ref int[] FirstArr)
{
Console.WriteLine(" 1 - удалить первый элемент
2 - удалить элемент по индексу
3 - удалить последний элемент");
int[] FinalArr = new int[FirstArr.Length - 1];
int YourChoiсe2 = int.Parse(Console.ReadLine());
if (YourChoiсe2 == 1)
{
Console.WriteLine(" Первый элемент массива удален");
for (int i = 0; i < FinalArr.Length; i++)
FinalArr[i] = FirstArr[i+1];
}
if (YourChoiсe2 == 2)
{
Console.WriteLine(" Элемент с каим индексом требуется удалить?");
int IndexOf = int.Parse(Console.ReadLine());
for (int i = 0; i < FinalArr.Length; i++)
{
if (i != FirstArr.Length)
FinalArr[i] = FirstArr[i];
}
}
if (YourChoiсe2 == 3)
{
Console.WriteLine(" Последний элемент массива удален");
for (int i = 0; i < FinalArr.Length; i++)
{
FinalArr[i] = FirstArr[i];
}
}
return FinalArr;
}
static void Main(string[] args)
{
int[] FirstArr = { 1, 2, 3 };
int[] FinalArr = new int[0];
Console.WriteLine(" Создан массив { 1 2 3}");
Console.WriteLine(" Вы можете выбрать одно из трех действий");
Console.WriteLine(" 1 - изменить размер массива
2 - добавить элемент в массив
3 - удалиь элемент массива");
int youChoise0 = int.Parse(Console.ReadLine());
if (youChoise0 == 1)
FinalArr = Resize (ref FirstArr);
if (youChoise0 == 2)
FinalArr = Add (ref FirstArr);
if (youChoise0 == 3)
FinalArr = Delete (ref FirstArr);
Console.WriteLine("Ваш массив :" );
for (int i = 0; i < FinalArr.Length; i++)
{
if (i==0)Console.Write("{");
Console.Write(FinalArr[i] + " ");
if (i == FinalArr.Length-1)Console.Write("}");
}
Console.WriteLine();
Console.WriteLine("Размер массива " + FinalArr.Length);
Console.WriteLine("Сумма элементов в массиве " + FinalArr.Sum());
Я человек простой. Вижу видео Сергея, сразу поставлю лайк)
Ссылка на ссылку.... аж ностальгия по С++ пробила) Спасибо!!!
Очень понятно и классно разъяснил. Спасибо большое.
Спасибо за ваши старания!
Сложная тема :) Спасибо что много примеров! Лучшие уроки!
я тоже учу сейчас на этом месте)
Давно начал учить C#?
@@ptichkasinichkamia Я его учил года 2 назад тоже по урокам в ютубе, но от Гоши Дударя(2 месяца занимался). Потом забросил, и вот недавно (месяц назад) открыл для себя SimpleCode. Объясняет он на уровень выше чем Дударь и в целом то что я учил 2 года назад оно помогло освежить большинство тем которые были в начале этого курса. Но дойдя до темы null и ref тут я уже как бы столкнулся с чем то новым) Интересно и сложно. Щас сижу пыхчу над домашкой ХD
@@КириллГетьман-у2я я тоже сейчас её делаю
@@ptichkasinichkamia Осталось сделать удаление элементов массива с начала, конца и по индексу.
16:35 - Недавно столкнулся с такой проблемой по незнанию. У меня это прям головную боль вызвало, почему передавая объект класса в метод тот на выходе ничего не менял. Оказалось ровно то, что Вы объяснили в видео, то есть нужно указывать ref в подобных ситуациях даже для ссылочных данных
Спасибо тебе искренне!
спасибо Сергей !!!
На нашем направлении в универе старшекурсники и преподаватели рекомендуют твои уроки!
Единственное, что хотелось бы уточнить - иногда даже с ref происходит копирование Value Type'ов и все тут. Например, если структуру инициализировать не с помощью конструктора, а с помощью инициализатора - там можно словить movdqu/movdqa/vmovdqu. Там много условий должно совпасть чтобы это произошло и на поведение программы это не влияет, но может повлиять на производительность.
Благодарю!
Нашел этот канал случайно, всё довольно доходчиво, но некоторые моменты я иногда не понимаю, и сижу с вопросом в голове ""а зачем так делать если это совсем не нужно""
к чему, я ПЫТАЮСЬ понять язык, но даётся с трудом, особенно какие то моменты, например с дз, просматривая тему, вроде бы как в голове отложилось, и порой понимаешь , что куда откуда и для чего, находишь некую связь, НО когда пытаюсь написать что то сам, например попробовать сделать дз, я вступаю в некий ступор, я не знаю с чего начать, что делать, что за чем следует, как проявить ту или иную задачу в голове. (надеюсь я дойду до уровня когда хотяб начну понимать). Но когда смотрю как ты выполнил дз, я сижу и думаю, так надо было делать так,и как бы понимаю весь код,я могу понять что куда и откуда, но сам писав код, затрудняюсь это делать, дай пару советов, как перебороть в себе этот момент со ступором. По урокам притензий не может, всё довольно доходчиво и хороший голос на слух, но я тупой ))) дай совет!!!
Значит ты не понимаешь, как строится структура самой программы( какая область видимости за что отвечает, где писать методы, а где основной код и тд). Пересмотри первые видосы или просто пиши простые программки по типу додать 2 числа, и постепенно добавляй в них что-то еще(например вывод сообщения). По сути, тебе просто не хватает практики. Вбиваешь в интернете задачки по с# и делаешь одну за другой)
як твої успіхи через рік?
угар хотите ? прошло три года а я до сих пор учу )))))))
Мы встроили тебе ссылку в ссылку, чтобы ты мог передавать одну ссылку, пока находишься в другой ссылке)
нереально круто обьясняет, в начале урока думал ну пиздец приплыли... и ближе к 22-й минуте я начинал понемногу понимать. это некий симпл в мире кодирования, как симпл в кс го
Как всегда классный урок)
Как же круто ты объясняешь.
Спасибо. Полезно и позновательно.
Самый лучший обьяснятор на ютубе
Спасибо за видео и лайк! Сергей, хотелось бы больше практических заданий или ссылку где их брать. Так же было бы интересно , чтоб Вы объяснили , что ещё нужно параллельно учить с языком С# в дополнении. Или пока только эти знания, а потом ещё, что-то?
Спасибо! Шикарное объяснение
Спасибо за отличные уроки и домашнее задание =)
Спасибо большое за урок) Скоро ли будет ООП?
большое спасибо за столь подробное объяснение
офигеть, первая домашка где я не могу решить задания😮, смог только 1 задание и то без Resize(с ним у меня выходила ошибка CS0176 )
Я познал истину ! Спасибо, Сэнсэй !
Спасибо за урок! Всё просто супер!)) Получаю кайф от выполненного дз чисто мной)
Спасибо за урок
Отличное видео, отличный парень!
Сергей, привет! Сразу лайк, но посмотрю позже)))
Комментарии в поддержку канала. Просьба не забрасывать это дело и конкретно курс по C#.
йоу йоу йоу новый урок))) когда закончились твои уроки начал бегать по всему ютубу как дворняга(
spasibo za urok, ochen interesno
Отлично!
Идея для следующего видео по Windows Forms: приложение, которое рисует фрактальное дерево, при чём пользователь сам задаёт изначальную длину ветки, делитель каждой следующей ветки, угол поворота и т.д.
Спасибо большое за видео)))
Поддерживающий комментарий для дальнейшего развития канала
Дам совет для начинающих и тем у кого есть еще не большой опыт. Видео помогает на более лёгкоммастерства
Обалдеть, чуствую себя самым умным на свете после того как всё понял
хахах, понимаю
А ДЗ смог сделать ?
@@vladimir_pl я нет😂, только первое
@@ZuraevD как успехи
@@makesuprise8259 норм, курс то я этот второй раз пересматривал. Ща пока остановился, другие предметы по возможности закрываю. Ну вообще да, обленился я
Спасибо
Добрый день! Благодаря Вашим видео легче учить С#, но все же заметил один интересный момент,подскажите пожалуйста,если Вам не сложно)
Дело в том,что когда использую структуру,то так как она не является статичной,то и метод Foo не видит её. Когда же вписываю публичные статические переменные,то метод начинает видеть их. На Вашем видео же вроде не обязательно ставить static перед переменными,когда у меня же требуется в Visual Studio. Немного не понял, почему так произошло,в любом случае с удовольствием буду продолжать смотреть Ваши видео)
наконец-то я поняль! Спасибо, Серега!
спасибо. очень четко.
Очень долго ждал этот урок
Благодарю
Спасииибо!
закипел я на этом видосе, особенно под конец.
Ура, новый видос!)
Не знал, спасибо за труд!
миллион раз спасибо
Больше домашек, ушло 4 дня на решение всех, но очень понравилось. Самые сложные - это задания по элементам. Оба решения по элементам, добавлению и удалению, почему-то получились разные. Последнее в разы короче вышло.
А как вам удалось изменить размер массива, не затрагивая при этом другие его элементы и их значения? Как вы смогли ввести изменения в длину массива без метода Resize? Подскажите, я в отчаянии.
Чел ты гений, смотрю для ознакомления и понимаю, что тебе цены не было бы в моем унике
Спасибо .
Спасибо большое
Красава
Ты просто бомба!! 💣 👍
Спасибо вам ❤😍
Хороший урок. Полезный, интересный и без забегания на 100500 шагов вперёд. Спасибо Сергей!
Спасибо!
Спасибо, понял с 1 раза
Указатели плюсов это что-то новое для шарпа)
Сергей, большое спасибо за уроки, но меня очень интересует вопрос: какого уровня знаний необходим си шарп, чтобы я мог писать игры на unity? Достаточно ли уже вышедших уроков, если нет то какие темы изучать самому??
Достаточно, в юнити много своих приколов, много методов унаследованных от класса MonoBehaviour, о которых тут явно речь идти не будет) Посмотрите видео coздания игры, увидите +- необходимый уровень знаний C#
Как минимум базовое понятие ООП нужно усвоить) Там всё на классах.
Пишу игры на Юнити уже седьмой год. И всё равно нет ощущения, что я достаточно знаю си-шарп. Чтобы понять, достаточно тебе твоих знаний или нет, есть простой способ определения: начни создавать собственную игру. Для этого надо понять философию Юнити. Что такое игровые объекты, что такое компоненты, зачем нужны всякие ресурсы/ассеты. И вот как начнёшь добавлять скрипты к игровым объектам, сразу станет понятно, достаточно твоих знаний или нет.
лучший в своём деле
Раза 3 пересмотрел чтобы полностью понять материал, спасибо огромное вам. Я правильно понимаю, что когда мы используем ref, то мы присваеваем переменной ссылку точно такую же, что и у другой переменной, но с тем отличием, что, когда мы будем взаимодействовать с этой ссылкой (менять её и т.д) то она будет меняться и в другой переменной, у которой мы её взяли, правильно?
🐱
Так же можно сказать, что мы копируем ссылку или само значение, но с оговоркой: типо мы сможем изменять и начальное состояние переменной.
Можно даже рассмотреть это на примере: У нас есть МакДак и в нём делают бургеры и мы решили дома сделать себе бургер точно такой же как и в МакДаке - получается здесь мы копируем только лишь бургер.
А вот если будем использовать ref, то когда мы решим сделать бургер точно такой же как и маке, то мы то сделаем его. Но если мы засунем туда какой - нибудь другой ингридиент, ну к слову БЕКОН, то этот БЕКОН появиться и в бургерах у МакДака, Верно?
Что-то так много всего написано...
"Я правильно понимаю, что когда мы используем ref, то мы присваеваем переменной ссылку точно такую же, что и у другой переменной, но с тем отличием..." - без отличия. Просто через ref передаётся ссылка. И когда мы в методе что-то делаем с этой переменной, то мы уже работает с теми значениями, куда указывает ссылка, а не с их копиями.
блин, я сейчас только на 11 уроке, решил посмотреть последний урок.... Да, надеюсб в скором времени я во всем этом буду хорошо разбираться, кстати ты клево объясняешь
Можно это интерпретировать вот так:
ref создает еще одно поле в оперативной памяти рядом со стеком, где лежат ссылки на значимые(value type) объекты. Если в голове всё представить именно так, то как и в случае с интерпретацией многомерных массивов как полок с тетрадями, всё очень легко усваивается. Надеюсь кому-то помог)
Кто хочет задание какое то выполнить, попробуйте такое.
Сделайте змейку. Ставится точка, и от нее уже последующая, после последующей еще одна и.тд....
Для поворотов(Их 4) используйте методы, для методов нужно будет указывать ref, пример работы гляньте у меня) Игрался долго с такой штукой(код так же скину).
(Все должно быть в .Net Core) не фреймворк.
Сергей, добрый день.
Вопрос: в примере, который начинается с 26:00 мы же могли вместо ref int b = ref Foo(arr); написать ref int b = Foo(arr); ? Ведь Foo(arr) итак возвращает нам ссылку на элемент Numbers[0].
Верно?
Тот же вопрос, но компилятор выдает ошибку "Невозможно инициализировать значением переменную по ссылке"
Сергей! Спасибо за ваши уроки с методами по ним всё ясно. Только если передачу по ref понятно как и где использовать, а вот передачу по значению - непонятно! Допустим если функция void и идёт какое-то вычисление , то оно видно только в видимой области данного метода! Не понятен смысл этого и непонятно для чего это нужно! Не могли бы вы посветить один урок именно этому? Как работает вы разжевали и это все ясно, не понятно зачем , как использовать и как применять на практике(. Вот допустим есть переменная и мы с ней выполнили какие-то действия в методе(без ref), то результат там и остался - в данной области видимости, а переменная в main останется не изменённой. Зачем это нужно??? Вот , что не понятно. Возможно нужно какое-то практическое или домашнее задание с примером такой работы. Спасибо!!!
"Вот допустим есть переменная и мы с ней выполнили какие-то действия в методе(без ref), то результат там и остался - в данной области видимости, а переменная в main останется не изменённой. Зачем это нужно??? " - это вообще не нужно. Любые новые значения внутри метода должны куда-то передаваться: или наружу (через ref или return), или на печать Console.Write(), или куда-нибудь в файл на диск или в базу данных. Если же ничего никуда не передаётся, то и незачем такое вычислять.
Хочу ответить словами киногероя по youtube запросу: Дядя Джуниор - Клан сопрано
xD придется пересматривать несколько раз)
Нничего себе, что у тебя за статистика по лайки/дизлайки(1100/1) ?)
Пришел к мнению что первый язык программирования должны быть плюсы . Хороший старт для освоения всех остальных .
Нууууу... я бы не стал начинать с плюсов. Всё-таки там очень много моментов, которые не являются интуитивно понятными. И к тому же много неоднозначностей. Шарп такие вещи сразу отрубает административными методами: "нельзя так делать, иначе тут можно понять двояко".
Ура дз))
Читаю комменты и виду что люди понимают и пишут что все понятно. А я понял только половину с 3 раза. Но я не сдамся, буду смотреть пока не пойму. Все остальное было проще понять.
Но даже если переменная а в методе Foo совершенно другая переменная, то при возвращении в main её значение тоже меняется с -5 на 2. Сидел втуплял, но так и не втупил. Ведь мне говорят, что они разные, но значения в них меняются одинаково.
"то при возвращении в main её значение тоже меняется с -5 на 2. " - нет, не так. При выходе из метода значения всех переменных, которые были внутри этого метода, уничтожаются. Следовательно, больше нет никакой переменной "а" внутри Foo. И как только ты выходишь из любого метода, то попадаешь в область видимости той функции, в которую ты вышел. В этом примере: выходя из Foo, попадаешь в Main. А тут у нас своя переменная "а", которая имеет своё значение, равное 2.
Итак, нужно помнить, что при выходе из метода уничтожаются все значения всех переменных этого метода.
По ссылочным данным, по аналогии с ярлычками - у нас есть ярлык для области памяти, если мы передаем его без рефа - то внутрь функции попадает не сам ярлык, а его копия. По этой копии мы можем получить данные из области памяти, но если мы попытаемся поменять путь в ярлыке, то на оригинал это никак не повлияет
Молодец, очень грамотно изложил суть!