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

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

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

Author24 — интернет-сервис помощи студентам
В чем разница и что лучше,объясните пожалуйста
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2012, 16:06
Ответы с готовыми решениями:

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

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

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

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

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

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

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
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 16:57  [ТС] 5
Спасибо)
Имеет ли ref прямое отношение к value-type,что б не создавать локальной копии?

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

Не по теме:

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



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

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

Цитата Сообщение от Noob.net Посмотреть сообщение
а как поступать с массивами?
Аналогично, передайте массив по ссылке или же создайте метод типа:
public string[] Method (...)
1
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.08.2012, 18:16 7
При передаче ссылочного типа в метод в методе можно менять любые его поля, при передаче же по ссылке можно не только менять поля, но и сам объект (напоминаю, что ссылочные типы - это хитро замаскированные автоматически разыменовывающиеся указатели, но все же указатели). То есть при передаче его можно менять его поля, но не ссылку.
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
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 18:19  [ТС] 8
Спасибо) задал много глупых вопросов,но теперь мне легче)
А есть там какая-то волшебная вкладочка или несколько что-б отслеживать память,ссылки и т.д.?
0
20 / 20 / 0
Регистрация: 05.02.2011
Сообщений: 65
03.08.2012, 18:28 9
Ну вся информация что нужна имеется в режиме отладки. Если Вам нужны более расширенные методы, то существует Intel Parallel Studio который является дополнительной утилитой для Visual Studio
1
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 18:29  [ТС] 10
Цитата Сообщение от 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
20 / 20 / 0
Регистрация: 05.02.2011
Сообщений: 65
03.08.2012, 18:39 11
Цитата Сообщение от Noob.net Посмотреть сообщение
то получу новую копию массива?
Ту же, но измененную.
1
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 18:52  [ТС] 12
Но в примере выше сам массив не изменяется в 1 методе

Добавлено через 6 минут
все понял,получаю ссылку,делаю дело с объектом,возвращаю данный объект...
Сорри господа туплю сегодня
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.08.2012, 20:17 13
Noob.net, конечно. Когда вы передаете ссылочное значение - вы передаете ссылку, по которой хранятся данные. С этими данными (элементы массива) вы можете делать что хотите, но с самой ссылкой вы не имеете права работать, поэтому в первом случае массив не меняется, а во втором - меняется. во-втором случае - конечно же получите новую копию, т.к. в данном случае вы получаете ссылку на новое значение, но которая видна снаружи (когда вы создаете внутри метода значение, оно видно только локально, return же позволяет этому локальному значению выйти за пределы метода и стать доступным остальному коду).
2
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
03.08.2012, 21:43  [ТС] 14
Цитата Сообщение от Psilon Посмотреть сообщение
Noob.net, конечно. Когда вы передаете ссылочное значение - вы передаете ссылку, по которой хранятся данные. С этими данными (элементы массива) вы можете делать что хотите, но с самой ссылкой вы не имеете права работать, поэтому в первом случае массив не меняется, а во втором - меняется. во-втором случае - конечно же получите новую копию, т.к. в данном случае вы получаете ссылку на новое значение, но которая видна снаружи (когда вы создаете внутри метода значение, оно видно только локально, return же позволяет этому локальному значению выйти за пределы метода и стать доступным остальному коду).
Вот) именно такой ответ мне был нужен)
0
03.08.2012, 21:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2012, 21:43
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru