0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 24
|
|
1 | |
Только из-за удобства ли используют ref вместо return12.11.2012, 20:27. Показов 4562. Ответов 15
Метки нет (Все метки)
Изучаю C# по самоучителю, не могу окончательно понять использование return, out и ref на практике, а именно:
1. Если нужно изменить значение, то используют ref вместо return - только из-за удобства? 2. Выходные параметры out и ref похожи, но существуют различия - "out применяют, если переменная не инициализированная" (зачем, вроде немного понятно), ?НО "в функции, которая использует параметр out, должно предполагаться, что ему не присвоено никакое значение" - здесь для меня сплошной туман! - Зачем производить операцию над переменной, если она без значения? Как и где это используется на практике?
0
|
12.11.2012, 20:27 | |
Ответы с готовыми решениями:
15
Что быстрее - ref или return? Написать метод с использованием return, out, ref Определить, у какого из прямоугольных треугольников периметр больше (return, ref, out) Можно ли вместо return использовать echo? |
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
|
||||||
12.11.2012, 20:40 | 2 | |||||
пример:
http://msdn.microsoft.com/ru-r... c0zb1.aspx из метода возвращаются два значения, одно bool = успешность преобразования (удалось / не удалось) 2е - собственно значение если удалось без ref/out вы что возвращать предлагает? структуру из bool и double? сложнее и непонятнее, тем более что для каждого метода возвращающего более 1 значения придется создавать свою структуру out - параметр для передачи его ИЗ метода, во-первых вам просто компилятор не даст его оставить неинициализированным почему должно предполагаться что ему не присвоено значение? очень просто, потому что это МОЖЕТ БЫТЬ так
соответственно вы бы это тоже могли пропустить, скомпилировать проект, запустить и только в том случае если этот метод будет выполняться поймать исключение во время исполнения (насколько труднее отлавливать ошибки исполнения, нежели компиляции объяснять надо?)
0
|
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 24
|
|
12.11.2012, 21:46 [ТС] | 3 |
Почему в функции Main указан Method (q), а не Method (out q)? И сама функция находится вначале Methoda?
0
|
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
|
|
12.11.2012, 21:56 | 4 |
потому что это пример который я набирал на форуме, а не в студии
действительно нужен out, не обратил внимание суть то все равно понятна?
0
|
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 24
|
|
12.11.2012, 23:08 [ТС] | 5 |
Суть понятна, но я не могу понять как и почему в реальных прогах используется out вместо ref. Насколько он полезен на практике? В Вашем последнем примере, зачем нужно было не инициализировать i?
И про возвращаемый параметр return: его в отличии от ref удобней использовать как результат функции? а ref только как ссылку на параметр?
0
|
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
12.11.2012, 23:15 | 6 |
Причина очень проста: out - это гарантия того, что значение переданной переменной будет изменено в методе, куда она передается, в то время как ref такого не гарантирует.
Именно поэтому переменные можно передавать через out, предварительно не проиницализировав. Тем самым, кстати, возможно сэкономя пару инструкций на лишнюю инициализацию.
0
|
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 24
|
|
13.11.2012, 08:26 [ТС] | 7 |
0
|
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 24
|
|
13.11.2012, 13:43 [ТС] | 9 |
Без обид, но у меня складывается ощущение, что я задал вопрос типа: "Что появилось раньше курица или яйцо?"
Чем ref в общих чертах отличается от out я понял, вопрос был: зачем на ПРАКТИКЕ использовать ref, если есть out?
0
|
12 / 12 / 3
Регистрация: 30.11.2011
Сообщений: 76
|
|
13.11.2012, 13:56 | 10 |
Я для себя уяснил так - если нужно получить из метода более одного значения, и эти значения инициализируются и вычисляются в САМОМ МЕТОДЕ, то нужно использовать out, а если эти значения инициализируются и используются где-то раньше (до вызова метода), и могут быть изменены в методе, а могут и не меняться, нужно использовать ref. Если возвращаемое значение у метода одно, то просто return
0
|
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
13.11.2012, 14:02 | 11 |
Так затем, что out обязывает изменять этот параметр в методе.
А если изменять его по каким-то причинам не нужно? Ну вот условие в методе: если "а", то изменить, а если "б", то оставить как есть. С out такое не прокатит.
0
|
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 24
|
|
13.11.2012, 14:15 [ТС] | 12 |
Начинаю немного понимать.. но не полностью... Оставлю этот вопрос открытым, когда будет много практики, тогда пойму окончательно :-)
0
|
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
13.11.2012, 14:20 | 13 |
Valerich555, да там понимать-то нечего: out и ref передают в метод не копию, а ту же самую переменную. Единственная разница в том, что out обязывает метод, в который она передается, присвоить ей какое-то значение, а ref - не обязывает.
Из этого так же следует, что переменную, которую нужно передать в метод с out, не обязательно перед этим инициализировать, т.к. это 100% будет сделано в методе. Но это уже так, бонус. Всё, никаких таинств и секретов тут больше нет - вы используете тот оператор, который считаете более подходящим для вашей задачи. Никто вас не обязывает использовать какой-то определенный из них.
1
|
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 24
|
|
14.11.2012, 13:45 [ТС] | 14 |
В моём самоучителе написано, что ref также как и out присваивает значение переменной, а return не присваивает.. И приведен пример отличия return от ref, а вот - про ref от out , без примера...
Я не понимаю, почему вы пишите, что ref не обязывает присвоить ей значения, когда оно присваивается?
0
|
14.11.2012, 14:24 | 15 | ||||||||||
Для передачи методу переменной через ref, нужно сначала проинициализировать переменную, а потом уже передавать в метод, иначе не скомпилится. Внимательно посмотри код, что я выложил, там показаны отличия. Скопируй себе и пройдись по коду в режиме отладки по шагам и смотри что происходит.
0
|
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
14.11.2012, 14:37 | 16 | |||||
Встречный вопрос: кто вас обязывает писать на форум? Вы ведь пишите - значит, кто-то обязывает!
При ref переменная в методе может меняться, а может и не меняться, а при out - меняется обязательно, иначе код просто не скомпилируется.
0
|
14.11.2012, 14:37 | |
14.11.2012, 14:37 | |
Помогаю со студенческими работами здесь
16
Насколько разумно использовать throw вместо return Какой оператор можно использовать в конструкторах вместо return Существуют ли какие-то инженерные задачи, которые используют только диагонально преобладающие матрицы Перегрузка функция отличающихся только return Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |