Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
3 / 3 / 0
Регистрация: 10.02.2014
Сообщений: 45
1

Копирование по значению и по ссылке

10.05.2014, 22:26. Показов 3164. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Объясните что означает копировать по значению, а не по ссылке, и наоборот, а так же что такое стек и управляемая куча
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2014, 22:26
Ответы с готовыми решениями:

Сделать копирование в ссылочном типе данных как по значению, так и по ссылке
Ни когда не разбирался с этим фэйлом, но сейчас очень нужно. Сделаю набросок, для наглядности d...

Передача по ссылке и по значению
Эта тема стара как мир, но я хотел уточнить одну вещь. QBluetoothAddress* address = new...

Передача данных по значению и по ссылке
Всем привет! Помогите плз разобраться в передаче данных в качестве параметров функции. *var и...

Передача в метод по ссылке и по значению
Запутался малость... class Program { static void Main(string args) ...

34
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.05.2014, 23:44 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от DataPlanner Посмотреть сообщение
Нет, по-моему без разницы, вы видете разницу? Поделитесь с нами священным знанием.
разница в том, что это разные вещи
0
insite2012
10.05.2014, 23:44
  #22

Не по теме:

Psilon, а что это за коротка версия? Та что у меня на 900 с лишним страниц...

0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.05.2014, 23:46 23
Пример №1:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        static void Main(string[] args)
        {
            var enumerator = new List<int> {1, 2, 3}.GetEnumerator();
            while (MoveNext(enumerator))
            {
                Console.WriteLine(enumerator.Current);
            }
        }
 
        private static bool MoveNext(List<int>.Enumerator enumerator)
        {
            return enumerator.MoveNext();
        }
пример №2:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        static void Main(string[] args)
        {
            var enumerator = new List<int> {1, 2, 3}.GetEnumerator();
            while (MoveNext(ref enumerator))
            {
                Console.WriteLine(enumerator.Current);
            }
        }
 
        private static bool MoveNext(ref List<int>.Enumerator enumerator)
        {
            return enumerator.MoveNext();
        }
чувствуем разницу?..
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
10.05.2014, 23:46 24
Цитата Сообщение от DataPlanner Посмотреть сообщение
Нет, по-моему без разницы, вы видете разницу?
Вы в этом уверены? Передайте в метод структуру с открытым полем типа, к примеру, int и измените внутри. А потом распечатайте. А потом передайте класс, тоже с открытым полем. И проделайте то же самое. У будет вам разница...
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.05.2014, 23:48 25
insite2012, пример выше лучше прочищает мозг Потому что такие особенности поведения воспринимаются как баги среды, хотя отвечают спецификации. Но при этом совершенно неожиданны для новичка
0
3 / 3 / 0
Регистрация: 10.02.2014
Сообщений: 45
10.05.2014, 23:54  [ТС] 26
insite2012, я кстати тоже не нашел с 400л. книжку, только 900 листов, Psilon, где вы нашли на 400л. версию?)
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
10.05.2014, 23:55 27
Psilon, согласен, но он не очень очевиден. И воспринимается потруднее. А вот очевидный и наглядный пример.
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
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication17
{
    class Program
    {
        static void Main(string[] args)
        {
            MyStruct ms = new MyStruct() { X = 20 };
            MyClass mc = new MyClass() { X = 20 };
 
            Console.WriteLine("Before:");
            Console.WriteLine("MyStruct.X = {0}",ms.X);
            Console.WriteLine("MyClass.X = {0}",mc.X);
 
            Method_1(ms);
            Method_2(mc);
 
            Console.WriteLine("After:");
            Console.WriteLine("MyStruct.X = {0}", ms.X);
            Console.WriteLine("MyClass.X = {0}", mc.X);
 
            Console.ReadLine();
        }
        public static void Method_1(MyStruct ms)
        {
            ms.X = 40;
        }
        public static void Method_2(MyClass mc)
        {
            mc.X = 40;
        }
    }
    struct MyStruct
    {
        public int X;
    }
    class MyClass
    {
        public int X;
    }
}
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
10.05.2014, 23:56 28
Пардон, коллеги, разницы так и не уловил. Давайте поконкретней, нам нужно сделать набор операций с переменной, какой тип лучше для этого подходит? И почему?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.05.2014, 00:01 29
DataPlanner, ну вот возьмите мой пример. Если использовать структуру, то будет трудноуловимый баг. При этом его не очень легко найти в коде из 5 строк, а если их будет раз в 100 больше, то можно будет искать неделями, в чем причина, если не знать разницу между структурами и классами.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
11.05.2014, 00:07 30
Ваши примеры посмотрел, они не совсем подходят для демонстрации преимуществ разделения типов.
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
11.05.2014, 00:14 31
Да потому что разницы нет
Для программиста так подавно
Есть только разница в использовании

А Суть ее
Цитата Сообщение от Psilon Посмотреть сообщение
то можно будет искать неделями
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
11.05.2014, 00:18 32
Цитата Сообщение от DPW Посмотреть сообщение
Да потому что разницы нет
Разница есть и очень значительная.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
11.05.2014, 00:18 33
DPW, это как нет? Взгляните на мой пример. В обоих случаях в метод передается параметр (БЕЗ модификаторов ref/out. Однако поле структуры после метода неизменно, чего не скажешь о классе. Вот и огромная разница. Вроде бы передавали по значению (как бы), а поле в классе изменилось.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
11.05.2014, 00:35 34
Что-то никто так и не упомянул, как Value Type ведет себя в стеке и почему итерации с Reference Type выполняются намного быстрее.
0
insite2012
11.05.2014, 15:06     Копирование по значению и по ссылке
  #35
 Комментарий модератора 
Коллеги, мне и самому нравится дискутировать на тему языка, но ТС, думаю, получил ответ на свой вопрос (и даже с избытком), поэтому прошу не развивать тему дальше заданного ТС вопроса.
Оффтоп перенесен сюда:
Оффтоп из темы про ValueType-ReferenceType
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2014, 15:06

С - > C# Передача значений по ссылке и значению
Есть Си функция: double lagrange(double X, double *Xi, double *Yi, int n) //Аппроксимация...

Передача объекта по ссылке или о значению
Да, да, снова этот вопрос. Допустим у меня есть объект Student с полями String surname и String...

Сравнение утраивания переменной по значению и по ссылке
У Дейтлов есть задача: Я написал такой код: #include&lt;iostream&gt; using namespace std; ...

Как копировать элемент по значению, а не по ссылке
int s; for(int i=0; i&lt;10; i++) { s=i; } Console.WriteLine(s); В данном контексте s не...


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

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