Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668

Void и Out: что лучше и в чем разница

03.08.2012, 16:06. Показов 2354. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В чем разница и что лучше,объясните пожалуйста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private object ChangeName(string name,object o)
{
o.Name = name;
  return o;
}
// вызываю
//тут создаю обьект Man1
Man1 = ChangeName(a,Man);
// или
private void ChangeName(string name,out object o)
{
o.Name = name;
}
// вызываю
Man1 = ChangeName(a,ref Man);//вопрос не о том что происходит с Man1
Я так понимаю во 2 я работаю напрямую с 1 объектом по ссылке,и возвращаю
его же,но измененного,а в первом я возвращаю новый объект?
как лучше,гуманнее и т.д.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2012, 16:06
Ответы с готовыми решениями:

Какая разница между void и Object
Добрый день. Скажите пж, в чем разница между void* ptrForAnything; и Object myObject; Ясно, что нужно разное обращение и...

System.Void из C# использоваться не может - для получения объекта типа void используйте typeof (void)
Изучаю с# по "Шилдт Г. - C# 4.0 полное руководство" При изучении конструктора возникла проблема: попытался запустить код на стр. 169, а...

Глобальные и локальные переменные: что лучше (или что для чего и в чем конкретная разница)?
Что лучше (или как надо (или что для чего и в чем конкретная разница)): 1. // объявление в глобальной области видимости ...

13
 Аватар для SunTechnic
20 / 20 / 0
Регистрация: 05.02.2011
Сообщений: 65
03.08.2012, 16:15
В первом случае Вы и передаете объект, и получаете его. Во втором же только возвращаете.

Что лучше - зависит только от ваших целей и назначений использования.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 16:37  [ТС]
Цитата Сообщение от SunTechnic Посмотреть сообщение
Во втором же только возвращаете.
Но он возвращается ведь измененный ?
C#
1
o.Name = name;
Добавлено через 1 минуту
C#
1
ref Man
это лишнее,я так понял,потому что у нас и так была б ссылка,правильно?
0
 Аватар для SunTechnic
20 / 20 / 0
Регистрация: 05.02.2011
Сообщений: 65
03.08.2012, 16:45
Как то так:

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
using System;
 
class Program
{
    string Name {get; set;}
 
    object GetName(string Name, object o)
    {
        Program temp = new Program();
        temp.Name = Name;
        return temp;
    }
 
    void GetName2(string Name, out object o)
    {
        Program temp = new Program();
        temp.Name = Name;
        o = temp;
    }
 
    static void Main(string[] args)
    {
        Program MC = new Program();
        Object MC2 = new Object();
        
        MC.GetName2("Имя", out MC2);
 
        Console.ReadKey();
    }    
}
Цитата Сообщение от Noob.net Посмотреть сообщение
Но он возвращается ведь измененный ?
Естественно!

Поэкспериментируйте с этим кодом.

Добавлено через 7 минут
Цитата Сообщение от Noob.net Посмотреть сообщение
C#
1
ref Man
это лишнее,я так понял,потому что у нас и так была б ссылка,правильно?
Ну ref применяется немного в другом случае. К примеру у нас уже есть сконструированный объект ( Program MC = new Program() ) и у него уже заполнены поля (Name к примеру), и нам нужно передать ЭТОТ (готовый объект) в метод. В этом случае мы применяем ref. А тут у нас имеется MC2, который по сути полуфабрикат, и "превращение" его в полноценный объект будет происходить в методе GetName2, который возвращает нам объект по ссылке, хотя по сути не должен возвращать ничего (void).

В таких случаях рекомендуется использовать более простой код как в первом методе, т.к. очень легко запутаться.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 16:57  [ТС]
Спасибо)
Имеет ли ref прямое отношение к value-type,что б не создавать локальной копии?

Добавлено через 31 секунду

Не по теме:

Напомнил мне паттерны 2 методом:)



Добавлено через 6 минут
Еще один пример List<int>
При передаче в метод,который принимает список,я передам ссылку?
а при return возвращаю тоже ссылку,как и с обычным классом?
а как поступать с массивами?
0
 Аватар для SunTechnic
20 / 20 / 0
Регистрация: 05.02.2011
Сообщений: 65
03.08.2012, 17:08
Цитата Сообщение от Noob.net Посмотреть сообщение
Имеет ли ref прямое отношение к value-type,что б не создавать локальной копии?
Вообще можно, я писал "на скорую руку" так что пробуйте.

Цитата Сообщение от Noob.net Посмотреть сообщение
При передаче в метод,который принимает список,я передам ссылку?
В смысле ссылку на List? Если да, то я не сталкивался с таким, попробуйте, но могу предположить, что если это такой же тип данных, то можно осуществлять такие же операции над ним.
Цитата Сообщение от Noob.net Посмотреть сообщение
а при return возвращаю тоже ссылку,как и с обычным классом?
При return Вы возвращаете то, что указано в возвращаемом типе метода, пусть то объект, строка или целочисленный тип, оно не является ссылкой, оно есть результат метода!

Цитата Сообщение от Noob.net Посмотреть сообщение
а как поступать с массивами?
Аналогично, передайте массив по ссылке или же создайте метод типа:
public string[] Method (...)
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.08.2012, 18:16
При передаче ссылочного типа в метод в методе можно менять любые его поля, при передаче же по ссылке можно не только менять поля, но и сам объект (напоминаю, что ссылочные типы - это хитро замаскированные автоматически разыменовывающиеся указатели, но все же указатели). То есть при передаче его можно менять его поля, но не ссылку.
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
using System;
 
namespace ConsoleApplication3
{
    internal class Program
    {
        static void Test(string[] array)
        {
            array = new[] { "I'm changed" };
        }
        static void Test2(ref string[] array)
        {
            array = new[] { "I'm changed" };
        }
 
        private static void Main(string[] args)
        {
            var arr = new[] { "I'm new" };
            Test(arr);
            Console.WriteLine(arr[0]);
            Test2(ref arr);
            Console.WriteLine(arr[0]);
            Console.ReadKey();
        }
    }
}
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 18:19  [ТС]
Спасибо) задал много глупых вопросов,но теперь мне легче)
А есть там какая-то волшебная вкладочка или несколько что-б отслеживать память,ссылки и т.д.?
0
 Аватар для SunTechnic
20 / 20 / 0
Регистрация: 05.02.2011
Сообщений: 65
03.08.2012, 18:28
Ну вся информация что нужна имеется в режиме отладки. Если Вам нужны более расширенные методы, то существует Intel Parallel Studio который является дополнительной утилитой для Visual Studio
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 18:29  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
  static void Test(string[] array)
        {
            array = new[] { "I'm changed" };
        }
        static void Test2(ref string[] array)
        {
            array = new[] { "I'm changed" };
        }
Спасибо) в 1 методе созд локальный массив,почему не передается ссылка,ведь string ссылочный тип?
То-есть если в 1 я сделаю так
C#
1
2
3
4
5
 static string[] Test(string[] array)
        {
            array = new[] { "I'm changed" };
            return array;
        }
то получу новую копию массива?
0
 Аватар для SunTechnic
20 / 20 / 0
Регистрация: 05.02.2011
Сообщений: 65
03.08.2012, 18:39
Цитата Сообщение от Noob.net Посмотреть сообщение
то получу новую копию массива?
Ту же, но измененную.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 18:52  [ТС]
Но в примере выше сам массив не изменяется в 1 методе

Добавлено через 6 минут
все понял,получаю ссылку,делаю дело с объектом,возвращаю данный объект...
Сорри господа туплю сегодня
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.08.2012, 20:17
Noob.net, конечно. Когда вы передаете ссылочное значение - вы передаете ссылку, по которой хранятся данные. С этими данными (элементы массива) вы можете делать что хотите, но с самой ссылкой вы не имеете права работать, поэтому в первом случае массив не меняется, а во втором - меняется. во-втором случае - конечно же получите новую копию, т.к. в данном случае вы получаете ссылку на новое значение, но которая видна снаружи (когда вы создаете внутри метода значение, оно видно только локально, return же позволяет этому локальному значению выйти за пределы метода и стать доступным остальному коду).
2
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 21:43  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Noob.net, конечно. Когда вы передаете ссылочное значение - вы передаете ссылку, по которой хранятся данные. С этими данными (элементы массива) вы можете делать что хотите, но с самой ссылкой вы не имеете права работать, поэтому в первом случае массив не меняется, а во втором - меняется. во-втором случае - конечно же получите новую копию, т.к. в данном случае вы получаете ссылку на новое значение, но которая видна снаружи (когда вы создаете внутри метода значение, оно видно только локально, return же позволяет этому локальному значению выйти за пределы метода и стать доступным остальному коду).
Вот) именно такой ответ мне был нужен)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2012, 21:43
Помогаю со студенческими работами здесь

В чем разница или что лучше (сеть)?
сеть:2 Г: GSM 850/900/1800/1900 МГц 3 Г: WCDMA: B1/2/5/8 4 Г: FDD-LTE: B1/B3/B7(U680A) 4 Г: FDD-LTE: B1/B3 (U680D) вопрос на...

В чем разница между Dispatcher и Task, где что лучше использовать?
Форумчане, расскажите в чем разница между Dispatcher и Task, где что лучше использовать? Есть два варианта оба отрабатывают правильно...

в чем разница между void f(int &n) и void f(int &&n)
:help:

Какие библиотеки OpenGL лучше использовать с VB.NET и в чем разница?
В данном деле я новичок. Программирую на Visual Basic NET. Пытаюсь создать графический фрагмент. Есть три dll: 1....

Разница между void и private void
Доброго времени суток, какая разницу между: private int a; и int a; ни там и ни там я не даю доступ к переменным из Unity, просто учил...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
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