Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 6

В чем отличие ref

27.08.2015, 12:52. Показов 2744. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В C# любой объект передается в метод по ссылке. Тогда в чем разница?
C#
1
void SomeMethod(SomeClass object)
C#
1
void SomeMethod(ref SomeClass object)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.08.2015, 12:52
Ответы с готовыми решениями:

Чем отличается ref и out
Добрый вечер. Решил потренироваться массивчики делать. Сделал парочку задач: 1 using System; using...

В чем отличие Collection от List
Парни, тупой вопрос, но объясните в чём разница?: List<string> list = new List<string>(); Collection<string> dinosaurs = new...

В чем отличие GetHashCode и Equals?
я не сильно понимаю зачем эти 2 метода?Ну сравню я обьекты через equals,зачем мне сравнивать через gethashcode? Какое преемущество он дает?

24
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
27.08.2015, 13:13
Silenty, в первом случае передача объекта, во втором передача ссылки на объект

Добавлено через 37 секунд
https://msdn.microsoft.com/ru-... 2147217396
0
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 6
27.08.2015, 13:23  [ТС]
Nikeys174, Разве в первом случае передается ссылка на объект? Я не вижу разницы. Объясните на пальцах
0
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
27.08.2015, 13:35
Silenty, есть передача значения, это первый вариант и он классический. У меня такое встречалось в приложении состоящем из двух классов, в первом классе объявили массивы, один задали, второй для ответа, передаем массивы в другой класс и массив для ответа будет пустым, потому что передав по значению мы создали дубль, хотя код отработал правильно. Передав по ссылке, мы вернем верное решение.

Пороюсь в записях скину пример
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
27.08.2015, 13:47
Silenty, во втором случае, если ты присвоишь object,у null, то весь объект который ты передал в метод тоже будет null. В случае с первым методом внешний объект будет доступен.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void SomeMethod(SomeClass Object)
{
    Object = null;
}
void SomeMethod(ref SomeClass Object)
{
    Object = null;
}
//...
SomeClass m = new SomeClass();
SomeMethod(m); // Здесь создаётся новая ссылка на объект, которая будет доступна только внутри метода.
Console.WriteLine((m == null).ToString()); // false
SomeMethod(ref m); // Здесь передали саму ссылку m объекта SomeClass.
Console.WriteLine((m == null).ToString()); // true
1
Заблокирован
27.08.2015, 13:48
Цитата Сообщение от Nikeys174 Посмотреть сообщение
передаем массивы в другой класс и массив для ответа будет пустым, потому что передав по значению мы создали дубль, хотя код отработал правильно.
Nikeys174, хотелось бы на это посмотреть...Массив всегда ссылочный тип, вне зависимости от того, какой тип у его элементов
0
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 6
27.08.2015, 13:55  [ТС]
BozKurt, Это единственное отличие?
0
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
27.08.2015, 14:05
Ev_Hyper,
Жутко извиняюсь, за такую оплошность, такой приём я использовал для подсчета количества элементов массива, подходящих под условие, при использовании двух классов для получения результата.
Была учебная задача.

Тогда спрошу тоже, массив ссылочный как Вы утверждаете, независимо от элементов, здесь мы передаем его по ссылке, для чего?
C#
1
Array.Resize(ref mass, c);
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
27.08.2015, 14:06
Лучший ответ Сообщение было отмечено Silenty как решение

Решение

Silenty, по сути да, емнип. Но это в корне меняет поведение объекта, точнее ссылки на этот объект, которую мы передаём в метод.

Добавлено через 45 секунд
Цитата Сообщение от Nikeys174 Посмотреть сообщение
здесь мы передаем его по ссылке
здесь мы передаём саму ссылку, если быть точным.
Так изменение массива произойдёт на ходу по мере выполнения тела метода, если бы параметр был без модификатора ref, то этот изменённый массив нужно было бы return'ить, чтобы получить изменения.
1
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
27.08.2015, 14:10
BozKurt, без ref-а, студия пишет ошибку
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
27.08.2015, 14:12
Nikeys174, конечно пишет, ведь метод же от фреймворка, а там параметр объявлен с ref модификатором. В #5 посте я привёл вполне наглядный пример.
0
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
27.08.2015, 14:15
Ev_Hyper, Silenty, BozKurt,
Program.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Linq;
//нахождение количества цифр входящих в последовательность
namespace CountNumber{
    class Program{
        static void Main(string[] args){
            int[] result = new int[10];                         //массив для результатов
            ConsoleKeyInfo Exit;                                //описывает нажатую клавишу консоли
            bool flag,conv;                                          //false - не вернный ввод
            string f="";
            //зацикливаем программу
            do{
                flag = false;
               
                while (!flag){
                    Console.Clear();
                    Console.WriteLine("Введите целое число");
                    f = Console.ReadLine();
                    //с помощью LINQ проверяем соответсвие количества числовых символов с длинной последовательности
                    conv = f.Length == f.Where(c => char.IsDigit(c)).Count();
                    if (!conv)
                    {
                        Console.WriteLine("Введенная последовательность не является целым числом");
                        Console.ReadLine();
                    }
                    else
                        flag = true;
                }    
                //вызов метода
                Solution.CountNumber(f, ref result);
                //печать результата
                for (int h = 0; h < result.Count(); h++)
                    if(result[h]!=0)
                        Console.WriteLine("Число {0} встречается {1} раз(а)",h,result[h]);
                Console.Write("Для выхода нажмите Esc, для повтора любую другую клавишу");
                Exit = Console.ReadKey(true);
            }
            while (Exit.Key != ConsoleKey.Escape);
        }
    }
}
Solution.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//процедура подсчета количества вхождений цифр в последовательность
namespace CountNumber{
    class Solution{
        public static void CountNumber(string res,ref int[] result){
            int temp = 0;                                               //временное хранение числа цифр
            char[] posl_single = res.ToCharArray();                     //преобразуем введное число в массив символов
            for (int i = 0; i < 9; i++){                                //цикл по цифрам от 0 до 9
                temp = 0;
                for (int j = 0; j < posl_single.Length; j++){           //цикл по каждой цифре последовательности 
                    if (i.ToString() == posl_single[j].ToString())      //проверяем соответсвие
                        temp++;
                }
                result[i] = temp;
            }
        }        
    }
}
без ref-a возвращает неверное значение

Добавлено через 1 минуту
Разъясните мне тогда этот вот вопрос, потому что я точно помню, что преподаватель меня долго тыкал носом в этот ref для массива
0
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 6
27.08.2015, 14:36  [ТС]
BozKurt, Спасибо! Тему можно закрывать
0
116 / 116 / 70
Регистрация: 10.11.2013
Сообщений: 445
27.08.2015, 14:39
Nikeys174, так неудивительно, что тыкал. Передаешь уже инициализированный массив и валишь туда элементы. А что если OutOfRange ? Или наоборот элементов будет меньше.

Не так бы придирался, если бы было out и внутри метода инициализация.
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
27.08.2015, 14:40
Nikeys174, поменяй объявление метода на такое:
C#
1
public static int[] CountNumber(string res, int[] result)
и верни из метода массив result
C#
1
return result;
. Тогда можешь вызывать без ref и получишь в итоге тоже самое. Только результат метода массиву присвой:
C#
1
result = Solution.CountNumber(f, result);
1
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
27.08.2015, 14:42
Anderok, препод требует всю инициализацию в одном классе, если речь не идет о вспомогательных элементах

Добавлено через 1 минуту
BozKurt, буду теперь разумнее, спасибо
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
27.08.2015, 14:45
Цитата Сообщение от Nikeys174 Посмотреть сообщение
препод требует всю инициализацию в одном классе
Имхо, лучше инициализировать переменные сразу при объявлении, либо при первом обращении к ним, а не где-то там...
0
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
27.08.2015, 15:00
BozKurt, как и видим в методе Main сразу вся инициализация, вот его требование
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
27.08.2015, 15:12
Nikeys174, тем не менее, необходимость ref модификатора это никак не объясняет.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
27.08.2015, 15:13
Nikeys174, BozKurt, Anderok, господа, о чем речь?
В примере Nikeys174 ref абсолютно ни к чему. Я не вижу смены указателя (читай ссылки) на массив внутри метода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2015, 15:13
Помогаю со студенческими работами здесь

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

В чем отличие свойств от полей?
Кто может просто объяснить?

В чем отличие WebClient и WebBrowser
Так в чем же?

В чем отличие реализации и обобщения(наследование)?
Почитал теорию, но все равно как-то непонятно. Вот если мы абстрагируемся от того, что в C# есть интерфейы (implementation). И рассмотрим...

Методы Parse и TryParse, в чем отличие?
В чем отличие этих методов? как они среагируют если в строке не числа а буквы?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru